使用 Matplotlib 创建动画子图

Beginner

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

简介

本逐步实验演示了如何使用 Python 中的 Matplotlib 创建具有多个子图的动画。该示例展示了如何在两个不同的子图中为一个圆和一条正弦曲线制作动画。

虚拟机提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们将立即为你解决问题。

导入库

第一步是导入所需的库,包括 Matplotlib、NumPy 以及 Matplotlib 的动画模块。

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.animation as animation
from matplotlib.patches import ConnectionPatch

创建图形和子图

第二步是创建用于动画的图形和子图。在本示例中,我们创建两个并排的子图,它们具有不同的宽高比。左边的子图是一个单位圆,右边的子图是一个空图,将用于为一条正弦曲线制作动画。

fig, (axl, axr) = plt.subplots(
    ncols=2,
    sharey=True,
    figsize=(6, 2),
    gridspec_kw=dict(width_ratios=[1, 3], wspace=0),
)
axl.set_aspect(1)
axr.set_box_aspect(1 / 3)
axr.yaxis.set_visible(False)
axr.xaxis.set_ticks([0, np.pi, 2 * np.pi], ["0", r"$\pi$", r"$2\pi$"])

绘制圆和初始点

第三步是在左边的子图上绘制圆和初始点。我们创建一个角度数组来生成圆,然后绘制每个角度的正弦值和余弦值。我们还在原点处绘制一个点。

x = np.linspace(0, 2 * np.pi, 50)
axl.plot(np.cos(x), np.sin(x), "k", lw=0.3)
point, = axl.plot(0, 0, "o")

绘制正弦曲线

第四步是在右边的子图上绘制正弦曲线。我们创建一个角度数组,然后绘制每个角度的正弦值。我们还保存了sine绘图对象,稍后将在动画中更新它。

sine, = axr.plot(x, np.sin(x))

绘制连接线

第五步是绘制一条连接两个子图的虚线。我们创建一个ConnectionPatch对象,它将左边子图的原点连接到右边子图的右边缘。我们还保存了con补丁对象,稍后将在动画中更新它。

con = ConnectionPatch(
    (1, 0),
    (0, 0),
    "data",
    "data",
    axesA=axl,
    axesB=axr,
    color="C0",
    ls="dotted",
)
fig.add_artist(con)

定义动画函数

第六步是定义动画函数。此函数将在动画的每一帧被调用,并将更新左边子图上点的位置、右边子图上正弦曲线的位置和数据,以及连接补丁的位置。

def animate(i):
    x = np.linspace(0, i, int(i * 25 / np.pi))
    sine.set_data(x, np.sin(x))
    x, y = np.cos(i), np.sin(i)
    point.set_data([x], [y])
    con.xy1 = x, y
    con.xy2 = i, y
    return point, sine, con

创建动画

第七步是使用FuncAnimation函数创建动画对象。我们传入图形对象、动画函数、帧之间的时间间隔(以毫秒为单位)、帧数以及动画重复前的延迟时间。

ani = animation.FuncAnimation(
    fig,
    animate,
    interval=50,
    blit=False,  ## blitting can't be used with Figure artists
    frames=x,
    repeat_delay=100,
)

显示动画

最后一步是使用pyplot模块的show函数来显示动画。

plt.show()

总结

这个循序渐进的实验展示了如何使用 Python 中的 Matplotlib 创建一个包含多个子图的动画。该示例展示了如何在两个不同的子图上对一个圆和一条正弦曲线进行动画处理。步骤包括导入库、创建图形和子图、绘制圆和初始点、绘制正弦曲线、绘制连接线、定义动画函数、创建动画对象以及显示动画。