Python 中有很多不错的数据可视化库,但是极少能渲染 GIF 图或视频动画效果。本文就分享一下如何用 MoviePy 作为其他可视化库的通用插件,制作动画可视化效果,毕竟这年头,没图不行,有动图更好。

MoviePy 能让我们用函数 make_frame(t) 自定义动画,函数会返回和时间 t 的视频帧(以秒为单位):

本文会涵盖 MayaVi、vispy、matplotlib、NumPy 和 Scikit-image 这些库。
基于 Mayavi 制作动画
Mayavi 是一个 Python 模块,可以制作交互式 3D 数据可视化。在第一个例子中,我们会将一个高度随着时间 t 不断变化的表面制作成动画:


另外一个例子是,制作一个坐标和观看角度都随着时间不断变化的线框网动画:


基于 Vispy 制作动画
Vispy 是另一款基于 OpenGL 的交互式 3D 数据可视化库。我们可以先用 Vispy 做出图形和网格,然后用 MoviePy 将其制作成动画:这里还是要推荐下小编的Python学习裙:【五 八 八,零 九 零,九 四 二】不管你是小白还是大牛,小编我都欢迎,不定期分享干货,包括小编自己整理的一份2018最新的Python资料和0基础入门教程,欢迎初学和进阶中的小伙伴。在不忙的时间我会给大家解惑。


下面是一些用 Vispy 制作的更复杂点的酷炫动画,它们是将 C 语言代码片段嵌入 Python 代码中,并微调 3D 着色器后制作而成:
基于 matplotlib 制作动画
虽然 2D/3D 绘图库 matplotlib 内置了动画模块,但是用 MoviePy 制作更轻更高质量的视频动画,而且运行速度更快。下面是用 MoviePy 基于 matplotlib 制作动画的方法:


Matplotlib 有很多漂亮的主题,和 Pandas、Scikit-Learn 等数字模块的兼容性也很好。我们来看一个 SVM 分类器,更好的理解随着训练点的数量增加时地图的变化动态:


简单来说,通过背景颜色我们就可以得知分类器辨识黑色点和白色点属于哪里。刚开始并不明显,但随着越来越多的数据点出现,这些点的分布逐渐呈月牙形区域。
基于 Numpy 的动画
如果是用 Numpy 数组(Numpy 是 Python 中的一个数字库),你不需要任何外部绘图库,你可以直接将数组输入 MoviePy 里。
将 Numpy 和 MoviePy 结合,可以做出很炫酷的动画效果。比如我们可以模拟僵尸病毒在法国蔓延的动态图(模拟!模拟!),以网格形式(Numpy 数组)模拟出法国地图,在上面执行所有模拟病毒感染和扩散效果的计算。每隔一段时间,一些 Numpy 操作会将网格转换为有效的 RGB 图像,并将其发送至 MoviePy:



最终效果如下:

将动画组合到一起
如果一个动画不够好看,那就来两个!我们可以借助 MoviePy 的视频组合功能将来自不同库的动画组合在一起:


或者更有艺术气息一点:

我们也可以对动画注释,这点在比较不同的算法和过滤器时,非常有用。我们展示一下来自 Scikit-image 库中的四张变换图像:


如果我们用 concatenate_videoclips 代替 CompositeVideoClip 和 clips_array,会得到标题效果式的动画:


结语
希望本文能帮你制作出令人惊艳的动画可视化。借助 MoviePy,也能将其它库的可视化转换为动画,只要其输出能转换成 Numpy 数组。
有些库本身也有动画模块,但通常修正和维护起来比较痛苦,MoviePy 相对稳定的多,也可以适用于很多情况。
另外,另一个 Python 库 ImageIO 也能编写视频,可以提供一个很简单的接口来读取或写入任何种类的图像、视频和容积数据。比如你可以用 imwrite() 写图像,用 mimwrite() 写视频/ GIF,用 volwrite() 写体积数据,或只是用 write() 写流式数据。python学习交流裙:588+090+942
快去动手操作吧,GIF 万岁!
网友评论