2014-02-25 238 views
3

下面的代碼顯示並保存了隨機矩陣的連續動畫。我的問題是我如何調整我保存的動畫的持續時間。我在這裏只有fps參數,dpi控制幀的剩餘時間,秒控制圖像的質量。 我想要的是實際控制將要保存的幀數就矩陣而言它們實際存儲的數量。matplotlib動畫持續時間

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

fig = plt.figure() 

N = 5 

A = np.random.rand(N,N) 
im = plt.imshow(A) 

def updatefig(*args): 
    im.set_array(np.random.rand(N,N)) 
    return im, 

ani = animation.FuncAnimation(fig, updatefig, interval=200, blit=True) 

ani.save('try_animation.mp4', fps=10, dpi=80) #Frame per second controls speed, dpi  controls the quality 
plt.show() 

我很好奇,如果我應該添加更多的參數。我試圖尋找在matplotlib類文檔中適當的一個,但我沒有成功:

http://matplotlib.org/api/animation_api.html#module-matplotlib.animation

回答

5

The documentation表明FuncAnimation接受一個參數frames,控制起到幀的總數。您的代碼因此可以讀取

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

fig = plt.figure() 

N = 5 

A = np.random.rand(N,N) 
im = plt.imshow(A) 

def updatefig(*args): 
    im.set_array(np.random.rand(N,N)) 
    return im, 

ani = animation.FuncAnimation(fig, updatefig, frames=10, interval=200, blit=True) 

ani.save('try_animation.mp4', fps=10, dpi=80) #Frame per second controls speed, dpi  controls the quality 
plt.show() 

可播放10幀。

+1

事實上,文件說: 幀可以是一臺發電機,可迭代或幀數。 –

+0

事實上,文檔中說: 幀可以是一個生成器,一個可迭代的幀或一些幀。 所以我的錯誤,我讀了一開始,不夠小心。 另一方面,您的解決方案確實提供了正確的結果 - 它保存的文件具有等於幀/ fps的適當持續時間。然而,顯示的文件(不是保存的文件)不遵循這種模式,它只是以非週期性的方式持續顯示新幀。有關這是爲什麼的任何想法? –

+0

你是什麼意思的「以非定期方式」? –

4

年後,我建立了這個例子,我回到每一次,我需要看看動畫的參數之間如何相互關聯。我決定在這裏分享給任何可能會有用的人。

TL/DR:

  • 對於保存動畫的持續時間將是frames * (1/fps)(以秒計)
  • 對於顯示動畫的持續時間將是frames * interval/1000(以秒爲)

下面的代碼允許您在提供即時視覺反饋的環境中使用此設置。

此代碼建立蜱根據參數的時鐘:

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


fig = plt.figure(figsize=(16, 12)) 
ax = fig.add_subplot(111) 
# You can initialize this with whatever 
im = ax.imshow(np.random.rand(6, 10), cmap='bone_r', interpolation='nearest') 


def animate(i): 
    aux = np.zeros(60) 
    aux[i] = 1 
    image_clock = np.reshape(aux, (6, 10)) 
    im.set_array(image_clock) 

ani = animation.FuncAnimation(fig, animate, frames=60, interval=1000) 
ani.save('clock.mp4', fps=1.0, dpi=200) 
plt.show() 

這將生成和保存的動畫,這將是這樣的:

enter image description here

因此,問題是,隨着時間的推移,黑色方塊會沿着大白色方塊移動。有60個白盒,所以你可以建立一個時鐘,在一分鐘內超過它。現在

,要注意的重要的是,有一些確定如何快速黑匣子將移動兩個參數:在ani.save功能animation.FuncAnimation功能和「FPS」 interval。第一個選項控制您要顯示的動畫中的速度,以及第二個將保存的動畫中的速度。

由於上面的代碼,您將生成60幀,它們以每秒1幀的速度顯示。這意味着時鐘每秒鐘都在滴答滴答。如果您希望保存的動畫時鐘每兩秒打勾一次,那麼您應該設置fps=0.5。如果您希望顯示的動畫時鐘每兩秒鐘點擊一次,則應設置interval=2000

[我會盡快編輯較長的解釋,因爲我有時間]