複数のアニメーション サンプル コードを試しましたが、どれも動作しません。以下は 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 notebook
IPython マジックを使用して%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 tk
IPython マジックを使用して%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())