Matplotlib的FuncAnimation不止一次调用init_func

时间:2018-03-23 14:01:37

标签: python animation matplotlib

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()吗?

1 个答案:

答案 0 :(得分:2)

首先应该提到"此功能将在第一帧之前调用一次。"表示在第一帧每个动画之前调用一次。因为默认情况下FuncAnimation的{​​{1}}参数为repeat,每次重复动画时,都会再次调用True

接下来你是对的,这个函数实际上被调用了两次。第一个调用是设置动画。内部显然需要这一步骤。因此,应考虑到这一点,并确保init函数不会在图中产生任何不可逆转的内容 另请注意,如果未提供任何init_func,则第一帧将用于内部设置过程。

因此,我认为您完全重置init_func中的lines属性。可能你甚至想要清除轴(init_func)以摆脱以前绘制的元素。