2016-04-06 13 views
0

私はmatplotlibが新しく、アニメーションの仕組みを理解しようとしています。pyplotの矩形のアニメーション最初の矩形が表示される

私は長方形の周りに移動するには、次のPythonコードを書いた:

import matplotlib.pyplot as plt 
import matplotlib.animation as animation 

class AnimRect(object): 
    '''Animate a rectangle''' 
    def __init__(self): 
     self.fig = plt.figure(figsize = (5,5)) 
     # create the axes 
     self.ax = plt.axes(xlim=(0,100), ylim=(0,100), aspect='equal') 
     # create rectangle 
     self.rect = plt.Rectangle((70,20), 10, 10, 
            fill=True, color='gold', ec='blue') 
     self.ax.add_patch(self.rect) 

    # initialization function 
    def init(self): 
     self.rect.set_xy((10.0, 10.0)) 
     return self.rect, 

    # animation function 
    def animate(self, i): 
     self.rect.set_xy((i,i)) 
     return self.rect, 

    def call_animation(self): 
     # call the animator function 
     animation.FuncAnimation(self.fig, self.animate, frames=91, 
           init_func= self.init, 
           interval=20, blit=True, repeat=False) 

     plt.show() 

def main(): 
    rect = AnimRect() 
    rect.call_animation() 

main() 

私は、コードを実行するとしながら、初期位置(10.0,10.0)に設定された矩形が常に、画面上にとどまりますアニメーション矩形は期待どおりに動作します。私は理由を理解できません。私はいくつかの小さな変更を試みましたが、解決策を見つけることができませんでした。私は間違って何をしていますか?

答えて

0

initメソッドでは、パッチの可視性をFalseに設定するか、完全に削除する必要があります。 initメソッドで

- それはいくつかのケースで有用である: それはマックOSのバックエンドでいくつかの奇妙な行動を持っているので、私はblit=falseを設定することに注意してください。初期化せずに

import matplotlib.pyplot as plt 
import matplotlib.animation as animation 

class AnimRect(object): 
    '''Animate a rectangle''' 
    def __init__(self): 
     self.fig = plt.figure(figsize = (5,5)) 
     # create the axes 
     self.ax = plt.axes(xlim=(0,100), ylim=(0,100), aspect='equal') 
     # create rectangle 
     self.rect = plt.Rectangle((70,20), 10, 10, 
            fill=True, color='gold', ec='blue') 
     self.ax.add_patch(self.rect) 
     self.call_animation() 
     plt.show() 

    # initialization function 
    def init(self): 
     self.rect.set_xy((10.0, 10.0)) 
     self.rect.set_visible(False) 
     return self.rect, 

    # animation function 
    def animate(self, i): 
     self.rect.set_xy((i,i)) 
     self.rect.set_visible(True) 
     return self.rect, 

    def call_animation(self): 
     # call the animator function 
     self.anim = animation.FuncAnimation(self.fig, self.animate, frames=91, 
           init_func= self.init, 
           interval=20, blit=False, repeat=True) 


def main(): 
    rect = AnimRect() 

main() 

:確かに私の混乱の源であった

import matplotlib.pyplot as plt 
import matplotlib.animation as animation 

class AnimRect(object): 
    '''Animate a rectangle''' 
    def __init__(self): 
     self.fig = plt.figure(figsize = (5,5)) 
     # create the axes 
     self.ax = plt.axes(xlim=(0,100), ylim=(0,100), aspect='equal') 
     # create rectangle 
     self.rect = plt.Rectangle((70,20), 10, 10, 
            fill=True, color='gold', ec='blue') 
     self.ax.add_patch(self.rect) 
     self.call_animation() 
     plt.show() 

    # animation function 
    def animate(self, i): 
     self.rect.set_xy((i,i)) 
     self.rect.set_visible(True) 
     return self.rect, 

    def call_animation(self): 
     # call the animator function 
     self.anim = animation.FuncAnimation(self.fig, self.animate, frames=91, 
           interval=20, blit=False, repeat=True) 

def main(): 
    rect = AnimRect() 

main() 
+0

それが問題を解決しました。 initメソッドを使用したソリューションは、blitがTrueまたはFalseのme(Anaconda Python 3.4 for Windows)で動作します。 2番目の解決方法では、blitをFalseに設定する必要があります。 – JFC

+0

よかった、うれしく思った。 'blit'は変更された要素を最初に' delete'しなければならないので、 'blit'は2番目のケースでFalseに設定する必要があります。 'init'メソッドがなければ、削除する要素はなく、エラーをスローします。 –

0

初期化機能init_func各フレームを初期化し、アニメーション全体を初期化しません。つまり、各フレームの最初に呼び出されています。それを投げ捨て、何が起こるかを見てください。

+0

。私はドキュメンテーションやチュートリアルでその重要な発言を読んだことを覚えていません。 – JFC