目次
はじめに
普段、
pythonで簡単なシミュレーションを作る時は、
MATLABと同じ方法で、
matploptlibで色々plotして、
pause関数を使うことで、
アニメーションを表示しています。
本当は、matplotlibの推奨であるanimationモジュールを使って、
描画関数を作って、描画すればいいのですが
animation — Matplotlib 2.2.2 documentation
animation Examples — Matplotlib 2.0.0 documentation
メインループの中で色々plotしながら、
アニメーションでデバックしたい時は、
animationモジュールを使う方法は面倒なので、
つい、このpauseを使った方法をしてしまいます。
そのようなアニメーションを作っている時に、
不意にそのアニメーションを動画にしたい時があるのですが、
animationモジュールを使っている場合は、簡単に動画が作れるのですが、
上記のように色んな所でplotし、pauseで表示するようなコードの場合、
動画を作るのが難しいという問題がありました。
そこで、そのようなmatplotlibアニメーションを
簡単に動画にできるPythonスクリプトを
作りましたので紹介したいと思います。
matplotrecorder
Pythonスクリプトは下記のリポジトリで公開されています。
こちらのリポジトリのREADMEでは、
こちらのツールを使って作成した、
サンプルのgif動画を見ることができます。
事前準備: ImageMagicのインストール
このスクリプトは、アニメーションの各フレームを
pngとして保存し、ImageMagicという
画像処理ライブラリを使って、png列を動画に変換しています。
従って、このスクリプトを使う前に、
ImageMagicをインストールし、
convertコマンドが使えるようになっている必要があります。
ImageMagicのインストール方法は下記を参照下さい。
動画の作成方法
上記のリポジトリのmatplotrecorderをDLし、
importして下記のサンプルコードのように
pauseの後にsave_frame() を呼び、
アニメーションが終わった後に、
save_movie()を呼んで、
動画を作成するだけです。
import matplotrecorder import math print("A sample recording start") time = range(50) x1 = [math.cos(t / 10.0) for t in time] y1 = [math.sin(t / 10.0) for t in time] x2 = [math.cos(t / 10.0) + 2 for t in time] y2 = [math.sin(t / 10.0) + 2 for t in time] for ix1, iy1, ix2, iy2 in zip(x1, y1, x2, y2): plt.plot(ix1, iy1, "xr") plt.plot(ix2, iy2, "xb") plt.axis("equal") plt.pause(0.1) matplotrecorder.save_frame() # save each frame # generate movie matplotrecorder.save_movie("animation.mp4", 0.1) # matplotrecorder.save_movie("animation.gif", 0.1) #gif is ok.
save_movie関数では、動画ファイル名と、
frame rateを引数として、設定する必要があります。
またこの関数では、convertコマンドを使っているので、
convertコマンドが対応している, mp4やgifなどの拡張子を設定すれば、
その種類の動画ファイルが自動生成されるはずです。
使える動画フォーマットは下記が参考になります。
参考資料
MyEnigma Supporters
もしこの記事が参考になり、
ブログをサポートしたいと思われた方は、
こちらからよろしくお願いします。