作死之旅: 数据动态可视化

关于数据可视化的一次艰难尝试

前言

        自从接触了Python后,被它丰富的扩展库所倾倒,于是奋不顾身地投入到科学计算这个大坑。浸淫大概1个半月后,开始尝试一开就非常感兴趣的数据动态可视化,即把数据以动画显示。方案是使用mayavi、moviepy等库。顺便一提,路人皆知的matplotlib虽然也提供动画模块,但是我嫌它不够华丽注:这是一个flag),于是就没有采用。
        实际上,GitHub上的一位大神早已实现,本人便是受其启发开始了这场试验(作死)。讲述这次作死之旅之前先交代一下我的开发环境:

        系统:win10专业版
        Python版本: Python3.5.1(anaconda发行包)
        IPython版本: 4.0.1
        Notebook版本:4.0.6
        试验前已安装好的库: numpy  matplotlib  pyqt  traits TraitsBackendQt

 
        那么“正式”开始吧!       

“正” “文”

        首先安装扩展库mayavimoviepy,在cmd命令行里依次键入

conda install moviepy
conda install mayavi

        moviepy的安装过程很惬意,然而当我在mayavi后面敲回车后,各种报错让我再也轻松不起来,然后我查询了一下,发现mayavi并不支持Python3,有点失望啊。
        但我马上打起精神,因为anaconda自带virtualenv虚拟环境,可以安装别的版本的python,而我之前已经在virtualenv里安装了python2.7。    
        接下来便进入python2.7,我设置的虚拟环境名称是python2,可以键入

activate python2

这样便进入python2.7了。后面经过conda和pip的连番轰炸,终于装好了mayavi和moviepy。
        然后启动notebook,键入

jupyter notebook

        正当我满眼期待地盯着黑漆漆的命令行,脑补notebook打开的场景时,又提示了一大堆错误。仔细查看,说的是不能解析配置文件,我看了下它给的文件路径,发现问题了,原来是中文用户名引起的错误,然后我开始冒汗了。这尼玛逗我呢 O-O  既然这样,干脆放弃notebook,在终端里调试程序,于是敲入jupyter qtconsole,希望打开ipython的GUI终端,结果也不行。My gash~
        深呼吸,冷静了几秒,我决定刚正面,后来证明这真是作死,虽然实际上从折腾mayavi开始就在作死了。我的计划是修改notebook默认的配置文件路径,于是立即想到环境变量,然并卵,作罢。接着,挪动配置文件到我指定的路径,然并卵,作罢。再然后,按此文所说添加sitecustomize.py文件,然并卵,而且还把pip搞异常了。最后,尝试修复pip,未果。。。。此时我已萌生摔键盘的冲动。
        为了避免陷入由问题制造问题的死循环,我决定就此打住,往别的方向考虑,不如换一个虚拟环境吧!既然如此,那么虚拟机自然是可以考虑的,就这么办!打开VirtualBox里安装好的XP,我努力压制自己已然不耐烦的心情,从头开始安装anaconda及相关的环境。所幸的是,安装完成后notebook顺利启动。至此我才正式打开了数据动态可视化的修罗场。
       

正文

        在notebook中新建一个ipynb文件,写入以下代码:

#关闭SSL认证,防止出现SSL_VERIFIED_FAIL
import ssl
ssl._create_default_https_context = ssl._create_unverified_context

import numpy as np
import mayavi.mlab as mlab
import moviepy.editor as mpy

duration = 2   #动画的时间区间

#用mayavi构建一个figure容器

fig_myv = mlab.figure(size=(220,220), bgcolor=(1,1,1))
X, Y = np.linspace(-2,2,200), np.linspace(-2,2,200)
XX, YY = np.meshgrid(X, Y)
ZZ = lambda d: np.sinc(XX**2+YY**2)+np.sin(XX+d)


#用movie播放figure里的画面
#同时输出一个GIF图片

def make_frame(t):
    mlab.clf()  #清除figure容器(重置颜色)
    mlab.mesh(YY,XX,ZZ(2*np.pi*t/duration), figure=fig_myv)
    return mlab.screenshot(antialiased=True)

animation = mpy.VideoClip(make_frame, duration=duration)
animation.write_gif("sinc.gif", fps=20)

        说明一下,关闭SSL认证是为了方便下载缺省的插件,比如此处我在运行脚本时提示缺少ffmepg.win32.exe,那么就要下载,如果不关SSL认证,可能导致认证失败而无法下载。
        捣腾完ffmepg,我继续调试程序,然后果然又出现了错误,并且提示我要确认一下是否安装了TraitsBackendWx或者TraitsBackendQt以及WxPython或者PyQt。我比较常用的是Qt库,所以就顺便用conda安装了PyQt和Traits。不知以往安装向来顺利的PyQt此时又出了问题,卡在了SIP上,这是PyQt所依赖的一个库,可是用conda和pip几番尝试后,都装不上,于是我去anaconda的镜像源网站看了下,的确找不到sip相关的包,只好尝试源码安装,依然装不上。此时我怀着近乎绝望的心情又用conda试了下,结果装上了。不信邪的我又去网站确认了下,还真有sip。这件事给我留下了阴影,我不禁开始怀疑人生:难道我真的是像知乎上某位大神说的,在面向运气编程?
       闲话略过,继续作死。此时只剩TraitsBackendQt还在作梗,我重拾早已跌入茅坑的信心,强行尝试着安装TraitsBackendQt,按惯例conda和pip双刀试一遍,不行。。。那就源码安装吧,我假装轻松地想着,进入GitHub寻找TraitsBackendQt的源码,当我找到并发现它是Enthought发行包套件中的一个项目时,我心里咯噔了一下,因为据我所知,Enthought是Python的商业发行包,要收费的,真的能直接用吗?而且TraitsBackendQt作为套件中的一个项目,其版本也不一定和我的PyQt相匹配。这样胡思乱想了一顿,我还是觉得试试再说。解压源码压缩包,打开cmd,切换到源码包的目录下,依次键入

python setup.py build
python setup.py install

        进行到install时果然还是出了问题,大概也是指版本匹配方面的问题,但是我已找不到别的包了,而且我用conda list查了下,发现竟然装上去了。既然这样,那就死马当活马医吧!
       
        重新运行程序,这回总算不提示缺这缺那的了,可我依然缺信心,因为又报错了。我核对了一下TrackBack给出的内容,发现了这段信息:

Version value has been already 1

        同时我按traceback指定的文件路径找到了出错的文件,里面确实把version value设定为2了。虽然不知道这又什么影响,但我认为修改它还是很值得一试的。于是我将它设为1,这样就可以和原先的1相匹配,我是这么想的。怀着紧张的心情按下运行键,我忐忑地等待着运行结果,出乎意料的是,真的产生了动态图像。
        不过大神所得到的图像是这样的
        作死之旅: 数据动态可视化_第1张图片
        而我的是这样的
        作死之旅: 数据动态可视化_第2张图片
这就是理想与现实的差距啊!

顺便说下,如果将上述代码中的make_frame改成make_frame_mpl就可以生成平面的sinc动画
作死之旅: 数据动态可视化_第3张图片

这次的经历告诉我还是要踏踏实实地学习基础,不要一味地追求所谓的”华丽“,被打脸的滋味还是不好受的。       

你可能感兴趣的:(Python)