概述
在 matplotlib 中,不仅可以绘制静态图形,也可以绘制动态图形。动态图形就是我们称呼的动画,绘制动画主要使用animation模块绘制动画。接下来我们将详细介绍该方法。
使用 animation 绘制动画
下面的示例主要演示了使用FuncAnimation类绘制动画,该类通过不断的调用 func 参数指定的函数进而绘制动画,该类的定义如下:
class FuncAnimation(TimedAnimation):
def __init__(self, fig, func, frames=None, init_func=None, fargs=None,
save_count=None, *, cache_frame_data=True, **kwargs):
参数如下:
- fig:指定用于绘制动画的 Figure 对象;
- func:在每一帧调用的函数。第一个参数将是 frames 参数的下一个值;
- frames:传递动画的每一帧,这个其实就是传递一个可迭代序列,这个值就是 func 接受的参数;
- 传递整数等价于传递
range(n)
; - 如果传递 None 等价于传递
itertools.count
;
- 传递整数等价于传递
- init_func:这个方法会在每一帧绘制前进行调用;
- fargs:用于每次调用 func 时接收的附加参数;
- save_count:当无法从 frames 参数推断帧数时使用该参数,默认 100;
- cache_frame_data:指定是否缓存帧数据,默认 True,一般不需要修改;
- kwargs:传递TimedAnimation类的关键字参数;
完整的示例程序如下:
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.animation import FuncAnimation
fig, ax = plt.subplots(1, 1)
x = np.linspace(0, 2 * np.pi, 5000)
y = np.exp(-x) * np.cos(2 * np.pi * x)
line, = ax.plot(x, y, color='cornflowerblue', lw=3)
ax.set_ylim(-1.0, 1.0)
def init():
line.set_ydata([np.nan] * len(x))
return line,
def animate(data):
line.set_ydata(np.exp(-x) * np.cos(2 * np.pi * x + float(data) / 100))
return line,
ani = FuncAnimation(fig, animate, init_func=init, frames=200, interval=2, blit=True)
ani.save("test.gif", fps=20, writer='Pillow')
plt.show()
绘制结果如下:
这里需要强调一点,func 在官网上的定义是
def func(frame, *fargs) -> iterable_of_artists
,所以在返回值的时候必须加上**,** 号,否则就会报错,只有加上了返回的才是Line2D对象。
往期回顾
- 【matplotlib】可视化解决方案——如何正确使用plot方法
- 【matplotlib】可视化解决方案——如何正确使用bar方法
- 【matplotlib】可视化解决方案——如何向画布中添加坐标轴
- 【matplotlib】可视化解决方案——如何正确使用matplotlib颜色系统
- 【matplotlib】可视化解决方案——如何实现画布局部放大功能
- 【matplotlib】可视化解决方案——如何更改matplotlib配置信息
- 【matplotlib】可视化解决方案——如何定制化网格
- 【matplotlib】可视化解决方案——如何向画布添加交叉直线
- 【matplotlib】可视化解决方案——如何解决matplotlib中文乱码问题
- 【matplotlib】可视化解决方案——如何设置matplotlib风格集
文中难免会出现一些描述不当之处(尽管我已反复检查多次),欢迎在留言区指正,相关的知识点也可进行分享,希望大家都能有所收获!!如果觉得我的文章写得还行,不妨支持一下。你的每一个转发、关注、点赞、评论都是对我最大的支持!