使用 Matplotlib 创建动画绘图

PythonPythonBeginner
立即练习

This tutorial is from open-source community. Access the source code

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

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 类来创建动画。我们将传递 figrundata_geninit_funcinterval 参数来创建动画。我们还将设置 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 类创建了一个衰减正弦波的动画。我们还学习了如何设置绘图、定义数据生成函数、定义初始化函数、定义动画函数以及创建动画。