FuncAnimation是matplotlib.animation模块的一个函数,用于创建基于函数更新的动画。以下是该函数的主要参数:
fig:matplotlib.figure.Figure对象。这是将要绘制动画的图形。
func:一个函数,它在每一帧被绘制时被调用。它应该接收一个参数(当前帧的值),并返回一个序列,该序列包含本帧中需要被重新绘制的Artist对象。
frames:可迭代对象或者生成器,生成器的每一个输出会被传入func以产生每一帧。例如,你可以传入一个列表,或者使用函数如numpy.linspace生成的序列。
init_func:一个函数,它在动画开始时被调用,用于设置动画的初始状态。它不应该接收任何参数,应该返回一个序列,该序列包含动画开始时需要被重新绘制的Artist对象。
fargs:额外参数元组。这些参数会被传入func。
save_count:如果frames是一个生成器,那么这个参数定义了要缓存的帧数。
cache_frame_data:如果为True,frames生成的帧数据将被缓存。
interval:每帧之间的延迟,单位是毫秒。
repeat_delay:如果repeat为True,这个参数定义了动画每次重复之间的延迟,单位是毫秒。
repeat:布尔值,定义动画是否应该在所有帧播放完后重复。
blit:布尔值,定义是否应该使用blitting来优化动画。如果为True,只有改变的部分会被重新绘制。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
fig, ax = plt.subplots() # 创建一个图形和一个子图
xdata, ydata = [], [] # 初始化x和y的数据
ln, = plt.plot([], [], 'r-') # 创建一个红色的线条,但是没有给它提供数据
def init():
ax.set_xlim(0, 2*np.pi) # 设置x轴的范围
ax.set_ylim(-1, 1) # 设置y轴的范围
return ln, # 返回线条对象,它将在动画开始时被重绘
def update(frame):
xdata.append(frame) # 将新的x坐标添加到数据中
ydata.append(np.sin(frame)) # 将新的y坐标(正弦值)添加到数据中
ln.set_data(xdata, ydata) # 更新线条的数据
return ln, # 返回线条对象,它将在每一帧被重绘
ani = FuncAnimation(fig, update, frames=np.linspace(0, 2*np.pi, 128),
init_func=init, blit=True, interval=50, repeat=False)
plt.show()
fig:这是你想要制作动画的图形对象,通过plt.subplots()创建。
update:这是一个函数,它在每一帧被绘制时被调用。这个函数接收一个参数(frame,这个参数的值在每一帧都会变化),并返回一个元组,该元组包含在这一帧中需要被重绘的Artist对象(在这个例子中,只有ln)。
frames=np.linspace(0, 2*np.pi, 128):这是一个序列,它的元素会被传递给update函数。在这个例子中,我们生成了从0到2π的128个等距的值。
init_func=init:这是一个函数,它在动画开始时被调用。在这个例子中,这个函数设置了子图的x轴和y轴的范围,并返回了一个元组,该元组包含在动画开始时需要被重绘的Artist对象(在这个例子中,只有ln)。
blit=True:这是一个布尔值,如果为True,那么只有那些从上一帧到下一帧有所改变的Artist对象会被重绘。这可以提高绘图的性能。
interval=50:这定义了每帧之间的延迟,单位是毫秒。在这个例子中,动画将每50毫秒更新一次,相当于20帧每秒。
repeat=False:这是一个布尔值,定义了动画是否应该在所有帧播放完后重复。在这个例子中,动画只会播放一次。
重复绘图前把之前的图删掉?
在动画重复前清除图形,可以在FuncAnimation中设置init_func参数。init_func是一个函数,会在每次动画开始时调用,可以在这个函数中重置图形到初始状态。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
fig, ax = plt.subplots() # 创建一个图形和一个子图
ln, = plt.plot([], [], 'r-') # 创建一个红色的线条,但是没有给它提供数据
def init():
ax.set_xlim(0, 2*np.pi) # 设置x轴的范围
ax.set_ylim(-1, 1) # 设置y轴的范围
ln.set_data([], []) # 重置线条的数据
return ln, # 返回线条对象,它将在动画开始时被重绘
def update(frame):
x = np.linspace(0, frame, 100) # 生成x坐标
y = np.sin(x) # 计算对应的y坐标(正弦值)
ln.set_data(x, y) # 更新线条的数据
return ln, # 返回线条对象,它将在每一帧被重绘
ani = FuncAnimation(fig, update, frames=np.linspace(0, 2*np.pi, 128),
init_func=init, blit=True, interval=50, repeat=True)
plt.show()
补充
cache_frame_data 参数决定了 frames 生成的数据是否应该被缓存。这个参数只有在 frames 是一个生成器的时候才有意义。
当 cache_frame_data=True (默认值),Matplotlib会在内存中存储由 frames 生成的每一帧的数据。这意味着如果动画被设置为重复播放(repeat=True),并且 frames 是一个生成器,那么在第二次及以后的播放时,Matplotlib不会再调用生成器,而是直接使用存储在内存中的数据。这可以提高性能,但是会增加内存的使用。
如果你的 frames 生成器产生的数据非常大,或者你不打算重复播放动画,那么你可以设置 cache_frame_data=False 来避免不必要的内存使用。在这种情况下,Matplotlib将在每一帧时重新调用 frames 生成器,而不是使用缓存的数据。
需要注意的是,如果 frames 是一个列表或者数组,而不是一个生成器,那么 cache_frame_data 参数没有任何效果,因为列表或数组的数据总是被存储在内存中的。