matplotlib的FuncAnimation简单介绍

FuncAnimation是matplotlib库用于创建动画的函数,它接受函数和帧数据来更新图形。文章详细介绍了FuncAnimation的关键参数,如frames、init_func、blit等,并通过一个绘制正弦波动画的例子展示了如何使用这些参数。此外,还讨论了缓存帧数据和blitting技术对动画性能的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 参数没有任何效果,因为列表或数组的数据总是被存储在内存中的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值