2016-08-16 175 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