matplotlib.animation.FuncAnimation是最常用可控的Python动态图表方案,通过init初始化、update逐帧更新数据、blit优化重绘实现正弦波等动画,支持GIF/MP4导出。

用 Python 做动态图表,matplotlib.animation 是最常用、最可控的方案之一。它不依赖外部库,能深度控制每一帧,适合教学演示、算法过程可视化、时间序列演化等场景。
核心思路:按帧生成 + 动画封装
动画本质是快速连续播放静态图帧。FuncAnimation 是最常用的类,它通过反复调用一个更新函数(func),在每帧中修改图形对象(如线条数据、散点位置、文本内容等),再重绘画面。
- 必须有一个“画布”——通常用
plt.figure()和ax = fig.add_subplot()创建 - 必须预先绘制初始图像(哪怕只是空图),否则后续无法更新
- 更新函数接收帧号(如
i)作为参数,据此计算当前帧应显示的数据 -
interval控制帧间隔(毫秒),frames指定总帧数或可迭代对象
基础示例:正弦波逐步展开
这是入门必练案例,直观体现“逐帧追加”的逻辑:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
fig, ax = plt.subplots()
x_data, y_data = [], []
line, = ax.plot([], [], 'r-')
def init():
ax.set_xlim(0, 4*np.pi)
ax.set_ylim(-1.2, 1.2)
return line,
def update(frame):
x_data.append(frame)
y_data.append(np.sin(frame))
line.set_data(x_data, y_data)
return line,
ani = FuncAnimation(fig, update, frames=np.linspace(0, 4*np.pi, 200),
init_func=init, blit=True, interval=50)
plt.show()
注意:blit=True 只重绘变化部分,大幅提升性能;init_func 负责设置初始视图和返回需动画化的 artist 对象。
立即学习“Python免费学习笔记(深入)”;
进阶技巧:多元素协同更新
实际应用中常需同时更新曲线、散点、标题、标注等。关键原则是:所有要动的元素都应在 update() 中显式设置,并在 return 中一并返回。
- 散点图:用
scatter.set_offsets(np.c_[x, y]) - 文本:用
text.set_text(f'Frame: {frame}')或set_position((x, y)) - 多条线:分别调用
line1.set_data(...)、line2.set_data(...) - 避免在
update中调用plt.title()等高层接口,改用ax.set_title()
保存与导出:GIF 和 MP4 都支持
动画对象 ani 提供 save() 方法,但需提前安装对应写入器:
- GIF:安装
pillow(pip install pillow),然后ani.save('wave.gif', writer='pillow') - MP4:需系统有
ffmpeg,设置writer='ffmpeg',并指定fps - 注意保存时加
dpi参数保证清晰度,例如dpi=150 - 若报错“writer not available”,检查是否已安装对应工具并加入系统 PATH
不复杂但容易忽略:动画不是“自动播放的视频”,而是基于 matplotlib 的重绘机制;理解 init、update、blit 三者关系,就能稳稳掌控每一帧。










