2014-01-29 103 views
8

我想繪製兩個使用Matplotlib動畫庫的旋轉橢圓,並且設法讓它工作(或多或少)。問題是正在渲染的第一幀沒有更新,所以當我在畫布中獲得兩個旋轉橢圓時,我也有橢圓在原始位置/方向。看看我的一段簡單的代碼:Matplotlib動畫:使用blit時第一幀保留在畫布中

import matplotlib.pyplot as plt 
from matplotlib.patches import Ellipse 
from matplotlib import animation 

fig = plt.figure() 
ax = fig.add_subplot(111, aspect='equal') 
e1 = Ellipse(xy=(0.5, 0.5), width=0.5, height=0.2, angle=60) 
e2 = Ellipse(xy=(0.8, 0.8), width=0.5, height=0.2, angle=100) 

def init(): 
    ax.add_patch(e1) 
    ax.add_patch(e2) 
    return [e1,e2] 

def animate(i): 
    e1.angle = e1.angle + 0.5 
    e2.angle = e2.angle + 0.5 
    return [e1,e2] 

anim = animation.FuncAnimation(fig, animate, init_func=init, interval=1, blit=True) 
plt.show() 

任何想法如何解決這個問題?我當然可以關閉blit,但這會讓它非常慢,所以這不是一個真正的選擇。

謝謝!

編輯:最後的(工作)代碼

import matplotlib.pyplot as plt 
from matplotlib.patches import Ellipse 
from matplotlib import animation 

fig = plt.figure() 
ax = fig.add_subplot(111, aspect='equal') 
e1 = Ellipse(xy=(0.5, 0.5), width=0.5, height=0.2, angle=60) 
e2 = Ellipse(xy=(0.8, 0.8), width=0.5, height=0.2, angle=100) 
ax.add_patch(e1) 
ax.add_patch(e2) 

def init(): 
    e1.set_visible(False) 
    e2.set_visible(False) 
    return [e1,e2] 

def animate(i): 
    if i == 1: 
     e1.set_visible(True) 
     e2.set_visible(True) 
    e1.angle = e1.angle + 0.5 
    e2.angle = e2.angle + 0.5 
    return [e1,e2] 

anim = animation.FuncAnimation(fig, animate, init_func=init, interval=1, blit=True) 
plt.show() 

回答

3

試試這個:

import matplotlib.pyplot as plt 
from matplotlib.patches import Ellipse 
from matplotlib import animation 

fig = plt.figure() 
ax = fig.add_subplot(111, aspect='equal') 
e1 = Ellipse(xy=(0.5, 0.5), width=0.5, height=0.2, angle=60) 
e2 = Ellipse(xy=(0.8, 0.8), width=0.5, height=0.2, angle=100) 


def init(): 
    return [ax] 

def animate(i): 
    if i==0: 
     ax.add_patch(e1) 
     ax.add_patch(e2)  
    e1.angle = e1.angle + 0.5 
    e2.angle = e2.angle + 0.5 
    return [e1,e2] 

anim = animation.FuncAnimation(fig, animate, init_func=init, interval=1, blit=True) 
plt.show() 

Screen-shot showing the correct behavior

試試這個另一種方法(不是我用僅僅是出於一個橢圓測試,它也呈現在這裏罰款):

import matplotlib.pyplot as plt 
from matplotlib.patches import Ellipse 
from matplotlib import animation 

fig = plt.figure() 
ax = fig.add_subplot(111, aspect='equal') 
e1 = Ellipse(xy=(0.5, 0.5), width=0.5, height=0.2, angle=60) 
ax.add_patch(e1) 

def init(): 
    e1.set_visible(False) 
    return e1, 

def animate(i): 
    if i==0: 
     e1.set_visible(True) 
    e1.angle = e1.angle + 0.5 
    return e1, 

anim = animation.FuncAnimation(fig, animate, init_func=init, interval=1, blit=True) 
plt.show() 
+0

沒有,沒有工作,結果和以前一樣。 – MPA

+0

你確定嗎?我複製了昨天發佈的代碼,並且在這裏順利運行。 (Matplotlib 1.2.1) –

+0

是的,我複製粘貼你的代碼,仍然像以前一樣。我也在v1.2.1上。 – MPA

3

建議的答案看起來像一個黑客。你隱藏了一幀的補丁,然後顯示下一個補丁,因爲沒有韻或理由。另外,我注意到每當調整圖的大小時都會調用init函數,然後在調整所提出的解決方案之後使橢圓不可見。

我認爲正確的做法是在Ellipse對象上設置animated=True。請參閱matplotlib animation documentation。這裏有一些代碼適用於我:

import matplotlib.pyplot as plt 
from matplotlib.patches import Ellipse 
from matplotlib import animation 

fig = plt.figure() 
ax = fig.add_subplot(111, aspect='equal') 
e1 = Ellipse(xy=(0.5, 0.5), width=0.5, height=0.2, angle=60, animated=True) 
e2 = Ellipse(xy=(0.8, 0.8), width=0.5, height=0.2, angle=100, animated=True) 
ax.add_patch(e1) 
ax.add_patch(e2) 

def init(): 
    return [e1, e2] 

def animate(i): 
    e1.angle = e1.angle + 0.5 
    e2.angle = e2.angle + 0.5 
    return [e1, e2] 

anim = animation.FuncAnimation(fig, animate, init_func=init, interval=1, blit=True) 
plt.show()