Python库matplotlib之六
- 动画
- FuncAnimation
- 构造器
- 成员函数
- 应用例子
动画
Matplotlib基于其绘图功能,还提供了一个使用动画模块,生成动画的接口。动画是一系列帧,其中每个帧对应于图形上的一个图。
Matplotlib使用两个类来实现动画, 它们分别是
- FuncAnimation:生成第一帧的数据,然后修改每一帧的数据以创建动画图。这个类在速度和内存方面更加高效,因为它绘制一次artist,然后对其进行修改
- ArtistAnimation:生成将在动画中的每个帧中进行绘制的artist列表(可迭代)。这个类很灵活,因为它允许任何可迭代的artist按序列进行动画处理。
FuncAnimation
构造器
词法:matplotlib.animation.FuncAnimation(fig, func, frames=None, init_func=None, fargs=None, save_count=None, *, cache_frame_data=True, **kwargs)
FuncAnimation是TimedAnimation的子类,它通过重复调用函数func来制作动画。
参数说明
-
fig,该参数类型是Figure
fig是一个Figure对象,用于获取所需事件,例如绘制或调整大小。 -
func,该参数类型是callable
func参数是一个函数,每一帧都需要调用该函数。该函数的第一个参数将是frames参数的下一个值。任何其他位置参数,都可以使用 functools.partial 或通过 fargs 参数提供。def func(frame, *fargs) -> iterable_of_artists
使用 functools.partial 提供参数通常更方便。通过这种方式,也可以传递关键字参数。要传递具有位置参数和关键字参数的函数,将所有参数设置为关键字参数,只需保留frame参数未设置:
blit == True,则 func 必须返回所有已修改或创建的artists的可迭代对象。blitting算法使用此信息来确定必须更新图形的哪些部分。
blit == False,则返回值不被使用,并且在这种情况下可以被省略。 -
frames,该参数类型是iterable, int, generator函数, 或None, 是可选的
frames是传递给函数func的数据源,动画每一帧数据
如果frames是iterable,则只需使用提供的值即可。如果 iterable 有长度,它将盖写save_count kwarg。
如果frames是整数,则相当于传递range(frames)
如果frames是生成器函数,则必须具有下列形式:def gen_function() -> obj
如果frames是None,则相当于传递 itertools.count。
在所有参数类型情况下,frames中的值只是简单地传递给用户提供的函数,因此可以是任何类型。 -
init_func,该参数类型是callable, 是可选的
init_func是用于绘制清晰框架的函数。如果未给出,则将使用帧序列中第一项的绘制结果。该函数将在第一帧之前调用一次。该函数具有下列形式def init_func() -> iterable_of_artists
blit == True,则 init_func 必须返回要重新绘制的artists的可迭代对象。blitting算法使用此信息来确定必须更新图形的哪些部分。
blit == False,则返回值不被使用,并且在这种情况下可以被省略。 -
fargs,该参数类型是tuple,或None, 是可选的
参数fargs是每次调用 func 的附加参数。使用functools.partial更好。 -
save_count,该参数类型是int, 是可选的
从frames到缓存的值的数量。仅当无法从frames推断出帧数量时,才使用此方法,即当它是没有长度的迭代器或生成器时。 -
interval,该参数类型是int, 默认值为200
帧之间以毫秒为单位的延迟。 -
repeat_delay,该参数类型是int, 默认值为0
如果参数repeat为 True,则该参数是连续动画运行之间以毫秒为单位的延迟。 -
repeat,该参数类型是bool, 默认值为True
该参数确定,当帧序列完成时,是否重复动画。 -
blit,该参数类型是bool, 默认值为False
blit确定是否使用位块传输来优化绘图。使用 blitting 时,任何动画artists都将根据其 zorder 进行绘制;然而,无论他们的zorder如何,他们都会被绘制在任何以前的artists之上。 -
cache_frame_data,该参数类型是bool, 默认值为True
cache_frame_data确定是否缓存帧数据。当帧包含大型对象时,禁用缓存可能会有所帮助。
成员函数
成员函数 | 说明 |
---|---|
_init_ (fig, func[, frames, init_func, …]) | |
new_frame_seq() | 返回新的帧信息序列。 |
new_saved_frame_seq() | 返回已保存/缓存的帧信息的新序列。 |
pause() | 暂停动画。 |
resume() | 恢复动画。 |
save(filename[, writer, fps, dpi, codec, …]) | 通过绘制每一帧,将动画保存为电影文件。 |
to_html5_video([embed_limit]) | 将动画转换为 HTML5 <video> 标记。 |
to_jshtml([fps, embed_frames, default_mode]) | 生成动画的 HTML 表示形式。 |
应用例子
这个例子是一个抛物线演示动画,通过不断调用函数update,演示不同的帧。
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as npdef update(frame):global t, z, scat, line2if frame < 39:print("frame: {0}".format(frame), end=",")else:print("frame: {0}".format(frame))# for each frame, update the data stored on each artist.x = t[:frame]y = z[:frame]# update the scatter plot:data = np.stack([x, y]).Tscat.set_offsets(data)# update the line plot:line2.set_xdata(t[:frame])line2.set_ydata(z2[:frame])return (scat, line2)if __name__ == "__main__":global t, z, scat, line2fig, ax = plt.subplots()t = np.linspace(0, 3, 40)g = -9.81v0 = 12z = g * t**2 / 2 + v0 * tv02 = 5z2 = g * t**2 / 2 + v02 * tscat = ax.scatter(t[0], z[0], c="r", s=5, label=f'v0 = {v0} m/s')line2 = ax.plot(t[0], z2[0], label=f'v0 = {v02} m/s')[0]ax.set(xlim=[0, 3], ylim=[-4, 8], xlabel='Time [s]', ylabel='Z [m]')ax.legend()ani = animation.FuncAnimation(fig=fig, func=update, frames=40, interval=30, repeat=False)plt.show()
上述程序运行产生的屏幕输出
C:\>python animation_1.py
frame: 0,frame: 0,frame: 1,frame: 2,frame: 3,frame: 4,frame: 5,frame: 6,frame: 7,frame: 8,frame: 9,frame: 10,frame: 11,frame: 12,frame: 13,frame: 14,frame: 15,frame: 16,frame: 17,frame: 18,frame: 19,frame: 20,frame: 21,frame: 22,frame: 23,frame: 24,frame: 25,frame: 26,frame: 27,frame: 28,frame: 29,frame: 30,frame: 31,frame: 32,frame: 33,frame: 34,frame: 35,frame: 36,frame: 37,frame: 38,frame: 39