使用matplotlib制作动态图
一、简介
matplotlib(https://matplotlib.org/)是一个著名的python绘图库,由于其灵活强大的绘图功能使得在python中可视化变得非常容易,关于matplotlib的基础知识这里不再介绍,有疑问可以去官网翻Tutorials和example学习。由于我们实际使用时常常是绘制静态图,忽略了matplotlib的动态图生成功能,同时matplotlib生成动态图的功能不是非常友善,因此大部分人在真的需要制作动态图时都会选择先用matplotlib生成一系列静态图片,然后再用其它相对比较容易使用的第三方python库生成动态图,如imageio(https://imageio.readthedocs.io/en/stable/#), 或者使用其它工具,如Matlab。这里打算简单介绍一下在matplotlib库中制作动态图的方法。
二、模块简介
matplotlib的animation模块提供了动态图制作功能,animation类提供了两个方法来生成动态图,即FuncAnimation和ArtistAnimation,这里我们使用FuncAnimation方法重复调用函数来生成图片。
1. FuncAnimation类介绍
FuncAnimation类的主要参数包括:
- fig: 每一帧画面绘制使得Figure对象
- func: 定义动画每一帧的更新函数,通常这一函数需要包含额外参数,此时可以用functools.partial来生成。
- frames:可以是可迭代对象,整数,或者生成函数或者缺省。
- init_func:初始化函数
- inteval:每一帧画面的停留时间
- repeat:当动态图中所有帧都播放完了之后是否重复播放
- bilt:是否使用blitting来优化绘图
- …
2. 定义动画更新函数
在FunAnimation类中,更新函数在每一帧中都会被重新调用,通过在更新函数中更改一些绘图函数的数据,在每一帧我们就能得到不同的图片,然后FunAnimation的Writer(后端)将这些图片组合就能得到动态图片。关于更新函数的一些需要注意的地方是:
- 如果设置了bilt == True,更新函数的最后就需要返回所有被修改或创建的Artists的引用变量
- 生成函数的第一个传入参数必须是当前的帧数,其具体值可以通过frames参数定义,可以是可迭代类型或整数
三、使用matplotlib制作动画
1.一步法制作动态图片
由于matplotlib本身自带强大的绘图功能,因此我们可以不用生成图片,直接在初始绘图的基础上通过更新函数来修改绘图数据,一步直接生成动态图片,方便快捷,以下是代码:
1 | import numpy as np |
以下为得到的动态图片:
2. 两步法制作动态图片
所谓两步法是指,首先用matplotlib生成一系列静态图片,然后结合matplotlib.image.imread读取图片功能和matplotlib.axes.Axes.imshow展示图片功能,来动态地更新图片,这种方法相比于上一种方法稍微复杂,但是这种方法灵活性更高,同时也可以用来组合一些非matplotlib生成的图片。以下为代码:
1 | import matplotlib.pyplot as plt |
得到的动态图片: