基于Python和MoviePy库实现数据的动态展示

基于Python和MoviePy库实现数据的动态展示

(翻译:以马内利) 

原文链接:Data Animations With Python and MoviePy  


Python拥有很多实现数据可视化的库,但是很少可以展示GIFs的动态视图。 这篇博客主要介绍怎样使用MoviePy库作为一个其他可视化库的通用插件。

MoviePy 提供函数 make_frame(t) 来创建相对于时间 t(s) 动画视频框。

在之前的博客中,曾把这个函数用于向量动画(animate vector graphics, 基于Gizh库), 还有光纤追踪场景动画(ray-traced 3D scenes, 基于POV-Ray). 这篇博客主要介绍科学计算先关库, Mayavi, Vispy, Matplotlib还有 Scikit-image.


使用Mayavi制作动画

Mayavi 是一个python的模块,具有一个简单的用户交互界面,用来制作和交互的3D数据展示。 第一个例子讲展示,表面高度随着时间(t)而变化。 

另一个例子将展示网眼线框的坐标和视角随着时间的变化而变化。 

因为Mayavi依赖于强大的ITK可视化引擎,因此它可以处理更加复杂的数据集。 

下面这个动画来是一个Mayavi 的事例。 

代码链接

EJZELfi.gif


基于Vispy的动画

Vispy是另一个可交互动态3D动画可视化库,基于OpenGL. 对于Mayavi, 我们首先创建图和网格,然后使用MoviePy使它们动起来。 

下面是一个来源于Vispy gallery的更加高级的例子,C嵌入到python里,用于调整优化3D的着色

代码链接

6PNEYB9.gif

代码链接


基于Matplotlib库创建动画

3D/3D作图库Matplotlib已经包含了动画模块, 但是我认为MoviePy可以制作更加高质量的动画,而且更加迅速,虽然不知道为啥,详情请看这里。 一下就是怎么使用 MoviePy 制作 Matplotlib制作动画: 

Matplotlib 拥有很多漂亮的框架,而且和很多数量模块例如 Pandas 和 Scikit-Learn 兼容性良. 让我们欣赏一下当训练数据集增长的时候SVM分类器逐渐提高对于地图分布的理解。 

简单来说,背景颜色告诉我们黑点和白点属于的类别。刚开始的时候没有清晰地线索,随着越来越多的数据加入以后,分类器逐渐理解数据呈月牙形分布状态。  


使用Numpy制作动画

如果经常处理Numpy数据阵列 (Numpy 是python的一个核心数字计算库), 无需任何其他拓展作图库就可以把数据阵列直接输入MoviePy.

下面的动画展示了法国丧尸大爆发的仿真动画(借鉴 Max Berggren的播客).  法国地图由网格建模(使用Numpy array)。丧尸病毒传播和感染都在这个模型上展示。 通过Numpy的一些简单操作后,这些网格被直接转化为

RGB图片,并输入到MoviePy. 

代码链接


叠合动画 

啥比一个动画更炫酷呢? 哥们你答对了,两个动画!得益于MoviePy的合并功能,我们可以把两个不同库制作的动画合并起来。 

或者来点更加文艺的

是不是有点太酷炫了,不过有时候观众们需要点重口味的东西才好。 

同样我们也可以注释动画,从而实现比较不同过滤器或者算法。让我们看一个Scikit-image库的图像转换例子。 

cMoPY1d.gif

如果我们使用concatenate_videoclips来代替CompositeVideo 和 Clipandclips_array, 我们将获得标题式动画,例子如下:

最后,像第一个例子一样,MoviePy在处理视频数据的时候非常实用。 最后一个例子为细菌种群在视频范围内的增长和在黑白像素下的计数。第三个动画是细菌种群大小和时间的指数增长关系

代码链接

uoITKiA.gif


一个库就可以搞定所有动画吗? 

我希望我已经提供足够多屌炸天的模板供你用来在组会报告的时候惊吓你的同事了。任何库只要输出结果可以转换成为Numpy阵列,就可以使用MoviePy做成动画。 

一些作图库虽然已经提供了动画模块,但是修改和维护是件虐心虐身的事情。多亏了广大用户在不同环境下的测试工作,MoviePy已经逐渐趋于稳定(也许用户已经懒得报告bug了), 可以适用于很多场景。虽然要走的路还很长,但是用户逐渐青睐MoviePy用于展示视频或者GIF动画是一件乐事。就像用户青睐Matplotlib为Pandas和Scikit-learn做可视化一样。 

作为结尾福利,也是为了更好地符合你们的需要,我要向大家提一提另一个库,ImageIO。 这同样是个具有视频展示的python库,主要用于小界面任何图像,视频和体数据的读写。比如说你可以使用  imwrite()来读写图片,minwrite()用于任何视频和GIF, volwrite()用于体数据, write()用于流数据。

原创文章,作者:以马内利,如若转载,请注明出处:/1333

联系我们

400-080-6560

在线咨询:点击这里给我发消息

邮件:1823388528@qq.com

工作时间:周一至周五,9:30-18:30,节假日同时也值班

友情链接:万达娱乐开户  万达娱乐注册  万达娱乐直属QQ  万达娱乐主管QQ  万达开户  万达招商QQ  万达主管QQ  万达娱乐招商QQ  万达注册  万达注册