mathjax

2013年9月4日水曜日

Gifアニメーション

 Gifアニメーション

ソースファイル
最新のmatplotlib(1.3.0)ではanimationにImagemagickという画像変換ソフトが使え、gifアニメが作れます。 このソフトはpythonのライブラリでは無くて、外部アプリケーションなので、別途インストールする必要がありますが、 便利でメジャーなソフトなので、入れておいて良いと思います。
Gifアニメはコマ送りのアニメなので、粗い時間間隔で計算された物理状態変化を見せたい場合に向いていると思います。 また、markdown上にもhtmlにも画像として貼れるので、扱いが容易です。
ただし、Windowsでは注意点があります。 Imagemagickのconvert.exeというのを内部で利用するのですが、windowsのシステム内にある別のconvertというコマンドと間違える恐れがあります。
参考サイト:http://stackoverflow.com/questions/3060205/error-invalid-parameter-fom-imagemagick-convert-on-windows
そこで、Imagemagickをインストールしたディレクトリをmatplotlibrc(matplotlibの設定ファイル)に登録しておく必要があります。
ユーザーの
.matplotlib\matplotlibrc
をテキストエディタで開いて、最後の行に
animation.convert_path: C:\Program Files\ImageMagick-6.8.6-Q16\convert
などと適切なディレクトリ名とコマンド名を入れておきましょう。
In [1]:
%matplotlib qt
通常、アニメーションは外部Window上で見ますので、上記のようにします。
In [2]:
from matplotlib import animation

# Set up the axes, making sure the axis ratio is equal
plt.figure(figsize=(5,3))
line,=plt.plot(0,0,'ko')
title=plt.title('')
plt.xlabel('x(m)')
plt.ylabel('y(m)')
plt.xlim(0,30)
plt.ylim(0,12)
plt.grid()
fig=plt.gcf()
ax=plt.gca()
ax.set_aspect('equal')

# This function moves the polygons as a function of the frame i
Nframes = 600
def animate(nframe):
    time=(nframe%60)*50.0e-3
    v=16.0
    g=9.8
    theta=20.0+(nframe/60)*5
    vx=v*np.cos(theta*np.pi/180.0)
    vy=v*np.sin(theta*np.pi/180.0)
    line.set_data(vx*time,vy*time-0.5*g*time**2)
    title.set_text(u'投げ上げ角度:'+str(theta)+u'度')
    return line,title
    
anim = animation.FuncAnimation(plt.gcf(), animate,
                               frames=Nframes, interval=50)
qtウィンドウ上でアニメーションが見えていると思います。 これを残したままでも、閉じてしまってもよいので、以下のコマンドを実行すれば、gifアニメーションが出来上がります。
In [6]:
anim.save('throw_up.gif',fps=20, writer='imagemagick')
これを
![image](files/throw_up.gif)
などとして、markdownセルに貼り付ければ、以下のようになります。
これを一般的な動画形式と比べてみましょう。
In [8]:
FFMpegWriter = animation.writers['ffmpeg']
metadata = dict(title='Movie Test', artist='Matplotlib',
        comment='Movie support!')
writer = FFMpegWriter(fps=15, metadata=metadata)
with writer.saving(fig, "writer_test.mp4", 100):
    for i in range(Nframes):
        animate(i)
        writer.grab_frame()
以上のようにすると、mp4という形式の動画ファイルができますが、これはノートブック上に貼り付ける事はできません。 以下のサイトを見ると、何とかできるのかも知れませんが、私にはまだ理解できていません。
参考サイト: http://jakevdp.github.io/blog/2013/05/12/embedding-matplotlib-animations/
youtubeに投稿すれば、貼りこめるようですが、ローカルに置けないのは不便ですね。 Bloggerでは動画として貼り込めますので、比較することができます。 mp4の方がサイズは小さいようですので、多数や長時間のアニメーションを公開する場合にはこちらの方が良いのかも知れません





2 件のコメント:

  1. これ以外のアニメーションについては別ページで紹介しています。
    http://nbviewer.ipython.org/6110544

    返信削除
  2. アニメーションの中身(放物運動の式)を少し変更しました。

    返信削除