Matplotlib 的 animation 概念指的是通过连续播放多幅图像来创建动画效果。这种动画形式也被称为帧动画,因为每个动画帧都是一个静态的图像,而通过连续播放这些帧,就形成了动画效果。在 Matplotlib 中,可以使用 animation 模块来实现这种帧动画。
Matplotlib 的 animation 模块提供了一些工具和函数来创建和操作帧动画。其中最基本的概念是Artist和FuncAnimation。
Artist 是 Matplotlib 中用于绘制图像的对象。在 animation 模块中,可以使用一系列的 Artist 对象来创建帧动画。每个 Artist 对象都代表一个静态的图像,而通过连续播放这些 Artist 对象,就形成了动画效果。
FuncAnimation 是 Matplotlib 中用于创建帧动画的函数。它接受一个函数作为参数,该函数定义了如何更新每个帧的图像。FuncAnimation 会不断重复调用这个函数,从而更新每个帧的图像并形成动画效果。
总的来说,Matplotlib 的 animation 概念是通过连续播放一系列的静态图像来创建动画效果,其中每个静态图像都是由 Artist 对象表示,而整个动画的播放过程是由 FuncAnimation 函数控制的。
Matplotlib 的 FuncAnimation
函数的主要参数包括:
fig
:表示动画所在的图表对象。这是一个matplotlib.figure.Figure
对象,用于显示和保存动画。ax
:表示动画中的轴对象。这是一个matplotlib.axes.Axes
对象,用于定义动画的绘图区域。func
:表示动画更新函数。这是一个可调用的函数,用于定义如何更新每个帧的图像。该函数接受两个参数:帧数和轴对象,并返回一个包含更新后的 Artist 对象的元组。frames
:表示动画的帧数。这是一个迭代器或整数,用于指定动画的总帧数。如果是一个迭代器,则每次迭代返回一个帧数,并用于调用更新函数。如果是一个整数,则表示动画的总帧数,并自动生成帧数序列。init_func
:表示动画的初始化函数。这是一个可调用的函数,用于在动画开始之前进行初始化操作。该函数接受一个轴对象作为参数,并返回一个包含 Artist 对象的元组。如果没有提供初始化函数,则默认为 None。fargs
:表示传递给更新函数的额外参数。这是一个元组,包含除帧数和轴对象以外的其他参数,这些参数将传递给更新函数。save_count
:表示保存的帧数。这是一个整数,用于指定保存的帧数。默认情况下,不保存任何帧。如果提供了该参数,则在动画播放过程中,每隔一定数量的帧就会保存一次当前帧的图像。interval
:表示帧之间的间隔时间。这是一个整数,用于指定帧之间的间隔时间(以毫秒为单位)。默认情况下,使用默认的帧速率(通常为每秒 30 帧)。repeat_delay
:表示动画重复播放之前的延迟时间。这是一个整数,用于指定动画重复播放之前的延迟时间(以毫秒为单位)。默认情况下,动画会立即重复播放。blit
:表示是否启用 blit 模式。这是一个布尔值,用于指定是否启用 blit 模式。如果启用 blit 模式,则只有更新的部分会被重绘,这可以提高动画的绘制性能。默认情况下,该值为 False。
通过合理设置这些参数,可以使用 FuncAnimation
函数创建各种定制化的动画效果。请注意,在使用该函数时,还需要导入相应的库和模块,并准备好所需的数据和绘图元素。
步骤:
- 导入必要的库:首先需要导入
matplotlib.animation
以及其他必要的库。import numpy as np import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation
- 准备数据:根据你的需求准备数据。这可以是静态数据或动态生成的数据。
- 创建画布和坐标系:像平常一样使用
matplotlib
创建图形和轴对象。 - 动画设计:定义一个函数,这个函数描述了如何根据帧数来更新图形,使用
FuncAnimation
或其他方法创建一个动画对象。 - 保存或显示动画:可以将动画保存为文件,也可以在窗口中直接显示动画。
使用 matplotlib.animation
可以为静态的图形添加动态元素,使得数据可视化更加生动和吸引人。
绘制一个具有动画效果的图表,具体要求如下:
(1) 绘制一条正弦曲线;
(2) 绘制一个红色圆点,该圆点最初位于正弦曲线的左端;
(3) 制作一个圆点沿曲线运动的动画,并时刻显示圆点的坐标位置。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
# 0. 设置中文黑体
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
# 1. 准备正弦曲线数据
x = np.linspace(0, 2 * np.pi, 100)
y = np.sin(x)
# 2. 创建画布和坐标系
fig = plt.figure(tight_layout=True)
ax = fig.add_subplot(111)
# 3. 绘制正弦曲线
ax.plot(x, y)
# 4. 动画设计
dot, = ax.plot(0, 0, 'ro') # 圆点初始位置
tom = ax.text(4, 0.9, s="", fontsize=14) # 添加无指定型文本在坐标(4,0.9)
# 定义每帧动画调用的函数
def zitao(a):
dot.set_data(x[a], y[a]) # 更新圆点的数据
tom.set_text(f"x={x[a]:.3f}, y={y[a]:.3f}") # 右上角的圆点的实时位置
return dot, tom # 返回值
ani = FuncAnimation(fig=fig, # 动画所在的画布
func=zitao , # 每帧动画调用的函数
frames=len(x), # 动画的长度
interval=50, # 更新动画的频率50mm
blit=True # 更新所有的点
)
# 5.将动画保存为gif图片
ani.save("pratice7.3.gif", writer='pillow')
# 6.展示图表
plt.show()