2013-08-06 47 views
3

您好:尊敬的StackOverfloooow會員, 我無法理解matplotlib的FuncAnimation模塊。你介意幫我一下嗎?我有兩個問題:Python Matplotlib FuncAnimation

  1. 爲什麼雙雙殞命initanimate功能需要只給PLOT回來後一個逗號?
  2. 爲什麼我的代碼不更新time_text?如果我在每次動畫之後都讓它打印出來,我會在控制檯中正確添加一個動畫,但文字不會在劇情中更新。

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

fig = plt.figure() 
sub = fig.add_subplot(111,xlim=(0, 10), ylim=(0, 1)) 
PLOT, = sub.plot([],[]) 
time_text = sub.text(1,1,"",transform = sub.transAxes, ha="right") 
t = 0 

def init(): 
    PLOT.set_data([],[]) 
    time_text.set_text("") 
    return PLOT,time_text 

def animate(i): 
    global t 
    x = np.linspace(0,10,1000) 
    y = np.exp(- ((x-0.01*i)/(2))**2)/np.sqrt(2*np.pi) 
    t += 1 

    PLOT.set_data(x,y) 
    time_text.set_text("time = "+str(t)) 
    return PLOT, time_text 

ani = animation.FuncAnimation(fig, animate, init_func=init, frames=2000, interval=20, blit=True) 

plt.show() 

回答

3

1)不太確定你的意思。在initanimate中,你需要返回PLOTtime_text,所以你用逗號分隔它們,這樣每個函數都會返回一個元組。

對於PLOT, = sub.plot([],[])中的「懸掛」逗號,sub.plot正在返回一個列表,其中包含單個元素matplotlib.lines.Line2D對象。 PLOT,正在解開這個單元素列表。因此,您也可以這樣做:

PLOT = sub.plot([],[])[0] 

獲取元素。

2)您的代碼確實更新了time_text,您只是將其繪製在圖的範圍之外。例如改變:

time_text = sub.text(1,1,"",transform = sub.transAxes, ha="right") 

要:

time_text = sub.text(1,0,"",transform = sub.transAxes, ha="right") 

得到它的右下角顯示,或0.5, 0.5得到它在屏幕中間顯示。

+0

好吧,我明白,非常感謝。關於逗號事件:例如,如果我完全省略了時間顯示並且只返回新的plotdata:'返回PLOT',那麼我得到一個錯誤。但是如果我返回'返回PLOT',它就會起作用。這是爲什麼? – throwaway17434

+4

PLOT,解開'PLOT'中的內容。在控制檯上試試這個:'a,= [1]'。然後打印'a'。 –

+0

好的,幫助,謝謝:) – throwaway17434

0

在python元組中使用括號和逗號(例如, (3,2) 這是一個2元組。一個元組將是長度爲1的(2,)。這與不具有長度定義的int 2是不同的。 注意:()是空元素的0元組。

在這種情況下,該函數返回一個長度爲1的枚舉值,因此省略逗號的 會使PLOT成爲一個枚舉值。用逗號 將元組PLOT的內容與返回值的內容進行匹配。

括號可以在作業中省略,因此PLOT與(PLOT)相同。

0

其他答案不完全回答第一個問題。

僅當使用blit=True時,才需要嚴格要求initanimate的返回聲明。預計這些功能會返回一組藝術家來更新動畫。有兩位藝術家,迴歸可能看起來像

return artist1, artist2 
# or 
return [artist1, artist2] 

如果要更新單個藝術家,必須記住仍然需要迭代。使用逗號後,單個藝術家,然後只是使功能返回一個可迭代的最簡單的方法

return artist1, 
# or 
return [artist1] 
相關問題