2016-08-16 125 views
3

我想保存一个我用Matplotlib中的FuncAnimation类创建的动画。我的动画更复杂,但当我尝试保存给出的简单示例here时,我得到同样的错误。Python Matplotlib FuncAnimation.save()只保存100帧

import matplotlib.pyplot as plt 
import numpy as np 
import matplotlib.animation as animation 

pause = False 
def simData(): 
    t_max = 10.0 
    dt = 0.05 
    x = 0.0 
    t = 0.0 
    while t < t_max: 
     if not pause: 
      x = np.sin(np.pi*t) 
      t = t + dt 
     yield x, t 

def onClick(event): 
    global pause 
    pause ^= True 

def simPoints(simData): 
    x, t = simData[0], simData[1] 
    time_text.set_text(time_template%(t)) 
    line.set_data(t, x) 
    return line, time_text 

fig = plt.figure() 
ax = fig.add_subplot(111) 
line, = ax.plot([], [], 'bo', ms=10) # I'm still not clear on this stucture... 
ax.set_ylim(-1, 1) 
ax.set_xlim(0, 10) 

time_template = 'Time = %.1f s' # prints running simulation time 
time_text = ax.text(0.05, 0.9, '', transform=ax.transAxes) 
fig.canvas.mpl_connect('button_press_event', onClick) 
ani = animation.FuncAnimation(fig, simPoints, simData, blit=False, interval=10, 
    repeat=True) 
plt.show() 

然而,当我试图通过增加线

ani.save('test.mp4') 

末挽救这个动画,只有前100帧被保存。

动画保存后,该功能重新启动并按预期显示,显示和更新图形200次(或直到t达到t_max,无论我设置的是什么)。但是保存的电影只包含前100帧。

暂停功能使其变得棘手。没有它,我可以将帧= 200放入FuncAnimation调用,而不是使用我现在用于帧参数的迭代器/生成器类型函数。但是通过放入帧数= 200,帧数似乎是不可思议的。

我该如何解决这个问题?

+0

如果像这样暂停工作,并且没有暂停,你可以保存你想要的所有帧,真的有问题吗?或者我误解了你的情况? –

回答

6
ani = animation.FuncAnimation(fig, simPoints, simData, blit=False, interval=10, 
           repeat=True, save_count=200) 

将解决该问题。

在内部,save只保存固定数量的帧。如果你传递一个固定长度的序列或一个数字,mpl可以正确地猜出长度。如果你通过一个(可能是无限的)发生器,并且不通过save_count,那么它默认为100.

+0

我正在做一个非常类似于暂停并开始动画,默认情况下它开始暂停。当我在FuncAnimation调用之后使用save方法并开始绘图时,它似乎不呈现任何内容或保存帧。我正在使用imagemagick,同时我正在使用一个生成器来绘制数据,所以我不会有save_count。 – bretcj7