MatplotlibアニメーションがIPythonノートブックで動作しない(空白のプロット)質問する

MatplotlibアニメーションがIPythonノートブックで動作しない(空白のプロット)質問する

複数のアニメーション サンプル コードを試しましたが、どれも動作しません。以下は Matplotlib ドキュメントから試した基本的なコードです。

"""
A simple example of an animated plot
"""
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

fig, ax = plt.subplots()

x = np.arange(0, 2*np.pi, 0.01)        # x-array
line, = ax.plot(x, np.sin(x))

def animate(i):
    line.set_ydata(np.sin(x+i/10.0))  # update the data
    return line,

#Init only required for blitting to give a clean slate.
def init():
    line.set_ydata(np.ma.array(x, mask=True))
    return line,

ani = animation.FuncAnimation(fig, animate, np.arange(1, 200), init_func=init,
    interval=25, blit=True)
plt.show()

上記を IPython Notebook で実行すると、空のプロットが生成されます。複数のブラウザ (Chrome、FF、IE) を使用して、複数のサーバー (Wakari を含む)、複数のマシンからこれを実行してみました。

アニメーションを mp4 ファイルに問題なく保存でき、再生すると見栄えがよくなります。

どのような助けでも大歓迎です!

ベストアンサー1

利用可能なオプションを要約すると、次のようになります。

  • displayループで使用する出力に図を表示するために使用しますIPython.display.display(fig)。ループを使用する場合は、新しい図が表示される前に出力をクリアする必要があります。この手法では、一般的にそれほどスムーズな結果が得られないことに注意してください。したがって、以下のいずれかを使用することをお勧めします。

    import matplotlib.pyplot as plt
    import matplotlib.animation
    import numpy as np
    from IPython.display import display, clear_output
    
    t = np.linspace(0,2*np.pi)
    x = np.sin(t)
    
    fig, ax = plt.subplots()
    l, = ax.plot([0,2*np.pi],[-1,1])
    
    animate = lambda i: l.set_data(t[:i], x[:i])
    
    for i in range(len(x)):
    animate(i)
    clear_output(wait=True)
    display(fig)
    
    plt.show()

  • %matplotlib notebookIPython マジックを使用して%matplotlib notebook、バックエンドをノートブック バックエンドに設定します。これにより、静的な png ファイルを表示する代わりに図が生きたまま表示され、アニメーションも表示できるようになります。
    完全な例:

    %matplotlib notebook
    import matplotlib.pyplot as plt
    import matplotlib.animation
    import numpy as np
    
    t = np.linspace(0,2*np.pi)
    x = np.sin(t)
    
    fig, ax = plt.subplots()
    l, = ax.plot([0,2*np.pi],[-1,1])
    
    animate = lambda i: l.set_data(t[:i], x[:i])
    
    ani = matplotlib.animation.FuncAnimation(fig, animate, frames=len(t))
    
    plt.show()

  • %matplotlib tkIPython マジックを使用して%matplotlib tk、バックエンドを tk バックエンドに設定します。これにより、図が新しいプロット ウィンドウで開きます。このプロット ウィンドウはインタラクティブなので、アニメーションも表示できます。
    完全な例:

    %matplotlib tk
    import matplotlib.pyplot as plt
    import matplotlib.animation
    import numpy as np
    
    t = np.linspace(0,2*np.pi)
    x = np.sin(t)
    
    fig, ax = plt.subplots()
    l, = ax.plot([0,2*np.pi],[-1,1])
    
    animate = lambda i: l.set_data(t[:i], x[:i])
    
    ani = matplotlib.animation.FuncAnimation(fig, animate, frames=len(t))
    
    plt.show()

  • アニメーションをmp4ビデオに変換する:

    from IPython.display import HTML
    HTML(ani.to_html5_video())
    

    またはplt.rcParams["animation.html"] = "html5"ノートブックの先頭で使用します。これには、HTML5 ビデオに変換するための ffmpeg ビデオ コーデックが必要です。ビデオはインラインで表示されます。したがって、これは%matplotlib inlineバックエンドと互換性があります。完全な例:

    %matplotlib inline
    import matplotlib.pyplot as plt
    plt.rcParams["animation.html"] = "html5"
    import matplotlib.animation
    import numpy as np
    
    t = np.linspace(0,2*np.pi)
    x = np.sin(t)
    
    fig, ax = plt.subplots()
    l, = ax.plot([0,2*np.pi],[-1,1])
    
    animate = lambda i: l.set_data(t[:i], x[:i])
    
    ani = matplotlib.animation.FuncAnimation(fig, animate, frames=len(t))
    ani
    %matplotlib inline
    import matplotlib.pyplot as plt
    import matplotlib.animation
    import numpy as np
    
    t = np.linspace(0,2*np.pi)
    x = np.sin(t)
    
    fig, ax = plt.subplots()
    l, = ax.plot([0,2*np.pi],[-1,1])
    
    animate = lambda i: l.set_data(t[:i], x[:i])
    
    ani = matplotlib.animation.FuncAnimation(fig, animate, frames=len(t))
    
    from IPython.display import HTML
    HTML(ani.to_html5_video())

  • アニメーションをJavaScriptに変換する:

    from IPython.display import HTML
    HTML(ani.to_jshtml())
    

    または、plt.rcParams["animation.html"] = "jshtml"ノートブックの先頭で使用します。これにより、アニメーションが JavaScript を含む HTML として表示されます。これは、ほとんどの新しいブラウザや%matplotlib inlineバックエンドと高い互換性があります。matplotlib 2.1 以降で使用できます。
    完全な例:

    %matplotlib inline
    import matplotlib.pyplot as plt
    plt.rcParams["animation.html"] = "jshtml"
    import matplotlib.animation
    import numpy as np
    
    t = np.linspace(0,2*np.pi)
    x = np.sin(t)
    
    fig, ax = plt.subplots()
    l, = ax.plot([0,2*np.pi],[-1,1])
    
    animate = lambda i: l.set_data(t[:i], x[:i])
    
    ani = matplotlib.animation.FuncAnimation(fig, animate, frames=len(t))
    ani
    %matplotlib inline
    import matplotlib.pyplot as plt
    import matplotlib.animation
    import numpy as np
    
    t = np.linspace(0,2*np.pi)
    x = np.sin(t)
    
    fig, ax = plt.subplots()
    l, = ax.plot([0,2*np.pi],[-1,1])
    
    animate = lambda i: l.set_data(t[:i], x[:i])
    
    ani = matplotlib.animation.FuncAnimation(fig, animate, frames=len(t))
    
    from IPython.display import HTML
    HTML(ani.to_jshtml())

おすすめ記事