簡體   English   中英

Python Matplotlib FuncAnimation

[英]Python Matplotlib FuncAnimation

您好親愛的StackOverfloooow成員,我無法理解matplotlib的FuncAnimation模塊。 你介意幫我一點嗎? 我有兩個問題:

  1. 為什么在只返回PLOT后, initanimate函數都需要逗號?
  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()

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

對於PLOT, = sub.plot([],[])的'懸掛'逗號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以使其顯示在屏幕中間。

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

只有在使用blit=True時才需要initanimate的return語句。 這些函數預計會返回一個可迭代的藝術家來更新動畫。 擁有兩位藝術家,回歸可能會像

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

如果要更新單個藝術家,則必須記住仍然需要迭代。 在那個單獨的藝術家之后使用逗號是使函數返回可迭代的最簡單方法

return artist1,
# or 
return [artist1]

在python中,元組是用括號和逗號編寫的,例如(3,2),它是一個2元組。 一個元組將是(2,),其長度為1.這與int 2不同,int 2根本沒有定義長度。 注意:()是具有空內容的0元組。

在這種情況下,函數返回長度為1的可枚舉,因此省略逗號會使PLOT成為可枚舉的。 用逗號表示元組PLOT的內容與返回值的內容相匹配。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM