简介
Matplotlib 是一个数据可视化库,用于在 Python 中创建静态、动画和交互式可视化。在本实验中,我们将学习如何使用 Matplotlib 创建动画绘图。我们将使用 FuncAnimation 类来创建一个衰减正弦波的动画。
虚拟机使用提示
虚拟机启动完成后,点击左上角切换到 笔记本 标签页,以访问 Jupyter Notebook 进行练习。
有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。
如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们会立即为你解决问题。
导入库
首先,我们需要导入必要的库。在本实验中,我们将使用 Matplotlib 和 NumPy。
import itertools
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.animation as animation
创建数据生成函数
接下来,我们需要创建一个函数来生成动画所需的数据。该函数将生成一个随时间衰减的正弦波。我们将使用 itertools.count() 函数生成一个无限的数字序列。我们将使用这些数字来计算正弦波的值。
def data_gen():
for cnt in itertools.count():
t = cnt / 10
yield t, np.sin(2*np.pi*t) * np.exp(-t/10.)
设置绘图
现在,我们需要设置绘图。我们将使用 Matplotlib 的 subplots() 函数创建一个图形和一个坐标轴对象。我们还将创建一个线条对象来表示正弦波。
fig, ax = plt.subplots()
line, = ax.plot([], [], lw=2)
ax.grid()
xdata, ydata = [], []
定义初始化函数
我们需要定义一个初始化函数,用于设置绘图的初始状态。在这个函数中,我们将设置 y 轴的范围,并清除线条对象中的数据。
def init():
ax.set_ylim(-1.1, 1.1)
ax.set_xlim(0, 1)
del xdata[:]
del ydata[:]
line.set_data(xdata, ydata)
return line,
定义动画函数
现在,我们需要定义一个函数,用于为动画的每一帧更新绘图。这个函数将获取由 data_gen() 函数生成的数据,并用新数据更新绘图。随着动画的进行,我们还将更新 x 轴的范围。
def run(data):
## update the data
t, y = data
xdata.append(t)
ydata.append(y)
xmin, xmax = ax.get_xlim()
if t >= xmax:
ax.set_xlim(xmin, 2*xmax)
ax.figure.canvas.draw()
line.set_data(xdata, ydata)
return line,
创建动画
最后,我们可以使用 FuncAnimation 类来创建动画。我们将传递 fig、run、data_gen、init_func 和 interval 参数来创建动画。我们还将设置 save_count 参数为 100,以确保只保存最后 100 帧。
ani = animation.FuncAnimation(fig, run, data_gen, interval=100, init_func=init,
save_count=100)
显示绘图
现在我们可以使用 Matplotlib 的 show() 函数来显示绘图。
plt.show()
总结
在这个实验中,我们学习了如何使用 Matplotlib 创建一个动画绘图。我们使用 FuncAnimation 类创建了一个衰减正弦波的动画。我们还学习了如何设置绘图、定义数据生成函数、定义初始化函数、定义动画函数以及创建动画。