2017-04-08 8 views
0

私はコードmatplotlibアニメーションがインタラクティブセッションでのみ機能する理由は何ですか?

import matplotlib.pyplot as plt 
from matplotlib.animation import FuncAnimation 

if __name__ == '__main__': 
    fig = plt.figure() 
    title = fig.suptitle("Test _") 

    def anim(i): 
     title.set_text("Test %d" % i) 
     plt.plot([0,1], [0,1]) 

    FuncAnimation(fig, anim) 
    plt.show() 

でファイルtest.pyを作成して、私のコマンドラインでそれを実行しようとすると、python test.pyを使用して、私はタイトルTest _とし、任意の軸をなし、空の画面を取得します。

同じ

python -i test.pyを実行するときに真であるが、私は今、対話型セッションで

>>> fig = plt.figure() 
>>> title = fig.suptitle("Test _") 
>>> FuncAnimation(fig, anim) 
>>> plt.show() 

すべてを同じコードを入力する場合に予想されるとしてだけで動作します。

私はこれほど長い間これを見てきましたが、これに関連する問題や疑問点は見つけられません。私はOS Xでpython 3.5.2でmatplotlib 2.0.0を使用しています。

これは(既知の)バグですか?なぜこれが起こっているのか、これがどのように解決できるのか、アイデアをお持ちの方?

答えて

2

animation documentation: "[..]インスタンスオブジェクトへの参照を保持することが重要です。"

したがって、FuncAnimationインスタンスを変数に代入することで、そのインスタンスをアクティブに保つ必要があります。

import matplotlib.pyplot as plt 
from matplotlib.animation import FuncAnimation 

if __name__ == '__main__': 
    fig = plt.figure() 
    title = fig.suptitle("Test _") 

    def anim(i): 
     title.set_text("Test %d" % i) 
     plt.plot([0,1], [0,1]) 

    ani = FuncAnimation(fig, anim) 
    plt.show() 
+0

私はあまりにも多くの時間を過ごしました...愚かな私はそれを見つけませんでした。ありがとう! PS:インタラクティブモード(好奇心のたからから)で動作する理由は何ですか? –

+0

インタラクティブモードとは、IPythonコンソールを意味しますか?その場合、セル出力はメモリ内に保持されるため、リファレンスを緩和しないでください。 – ImportanceOfBeingErnest

+0

いいえ、それはPythonインタプリタのインタラクティブモードです。 [この回答](http://stackoverflow.com/q/23843234/4375377)私の例でアニメーションオブジェクトがガベージコレクションされていない理由を説明します... –

関連する問題