matplotlib.animation.FuncAnimation
的文档说:
init_func :[...]此功能将在第一帧之前调用一次。
但每当我使用FuncAnimation
时,都会多次调用init_func
。
您可以通过向basic example from Matplotlib's website添加打印语句来查看此内容:
"""
A simple example of an animated plot
"""
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
fig, ax = plt.subplots()
x = np.arange(0, 2*np.pi, 0.01)
line, = ax.plot(x, np.sin(x))
def animate(i):
line.set_ydata(np.sin(x + i/10.0)) # update the data
return line,
# Init only required for blitting to give a clean slate.
def init():
# Add a print statement to the init function:
print('Initializing')
line.set_ydata(np.ma.array(x, mask=True))
return line,
ani = animation.FuncAnimation(fig, animate, np.arange(1, 200), init_func=init,
interval=25, blit=True)
plt.show()
除了制作可爱的情节外,它还会立即提供标准输出:
Initializing
Initializing
如果我保持动画运行,init_func
实际上是一遍又一遍地调用!
这是一个错误还是一个功能?我该怎么办呢?
一点背景:我使用init_func
初始化多个图as described here,仅在一个类中:
class MyAnimation:
def __init__(self, n):
self.fig, self.ax = plt.subplots()
self.n = n
self.lines = []
def run_animation(self):
def init():
for i in range(self.n):
line = ax.plot([], [])[0]
self.lines.append(line)
return self.lines
def animate(i):
... # Update lines
return self.lines
animation = FuncAnimation(self.fig, animate, init_func=init, blit=True)
plt.show()
当然,如果init()
被多次调用,这是没有意义的,因为额外的行将被追加到self.lines
。
我的方法不是很好的做法吗?
我应该在self.lines = []
函数中设置init()
吗?
答案 0 :(得分:2)
首先应该提到"此功能将在第一帧之前调用一次。"表示在第一帧每个动画之前调用一次。因为默认情况下FuncAnimation
的{{1}}参数为repeat
,每次重复动画时,都会再次调用True
。
接下来你是对的,这个函数实际上被调用了两次。第一个调用是设置动画。内部显然需要这一步骤。因此,应考虑到这一点,并确保init函数不会在图中产生任何不可逆转的内容 另请注意,如果未提供任何init_func,则第一帧将用于内部设置过程。
因此,我认为您完全重置init_func
中的lines
属性。可能你甚至想要清除轴(init_func
)以摆脱以前绘制的元素。