歩いたら休め

なんでこんな模様をしているのですか?

【Python】matplotlibでグラフのgifアニメを作成

Rではanimationというライブラリでgifアニメが作れるという話を聞き、Pythonでも同じことができないかどうか調べてみました。

 

具体的には↓の記事でRを使ってやってることです。

これからの可視化は動画の時代~Rでanimationパッケージで動画を作成する方法@Tokyo.R #20 - Analyze IT.

ニコニコ動画のボーカロイド共演ネットワーク - 驚異のアニヲタ社会復帰への道(ネットワークの時間発展のアニメーション、かっこいい)

 

Pythonのmatplotlibでのやり方はこの記事を参考にしました。matplotlibのバージョン1.3.0以降でImageMagickと連携してgifアニメが作れるそうです。

Making GIF animations with Matplotlib | Seeing Systems

この記事だとnumpyをインポートし忘れてたり、意外に穴があるのでコード書きなおしときます。

import pandas as pd
import pymc as mc
import matplotlib.pyplot as plt
from matplotlib import animation
import numpy as np


data = pd.DataFrame(data=0., index=np.arange(0, 30, 1), columns=np.arange(0,1, 0.01))
for exp in data.index.values:
   data.ix[exp] = np.arange(0,1, 0.01)**(.1*exp)

def animate(nframe):
   plt.cla()
   plt.plot(data.columns.values, data.ix[nframe])
   plt.ylim(0,1)
   plt.title('Exp: %.2f'%(1.*nframe/10.))

fig = plt.figure(figsize=(5,4))  

anim = animation.FuncAnimation(fig, animate, frames=30)
anim.save('demoanimation.gif', writer='imagemagick', fps=4);

 

必要なパッケージ(pymcなど)をインストールして、さて上のコードを動かそうと思ったら、最後のanim.save('demoanimation.gif', writer='imagemagick', fps=4);で引っかかってました。調べてみたところ、gif形式で保存(write='imagemagick')するにはImageMagickというアプリケーションが必要だと次の記事に書いてました。

 

ちなみにmp4形式としては、特に何もインストールor設定する必要もなく出力できます。

金星☆ちゃんねる: Python:matplotlibでScatterを使った2Dアニメーション

 

というわけでまずはImageMagickのインストールから。渡しの場合windowsの64bitなので「ImageMagick-6.8.7-7-Q16-x64-dll.exe」をインストール。dllとstaticの二種類ありますが、dllで大丈夫なようです。

 

あとはこれを参考にmatplotlibを設定。

Physical Entity-Oriented Python Learning Experiment: Gifアニメーション

 

そこで、Imagemagickをインストールしたディレクトリをmatplotlibrc(matplotlibの設定ファイル)に登録しておく必要があります

ユーザーの

.matplotlib\matplotlibrc

テキストエディタで開いて、最後の行に

animation.convert_path: C:\Program Files\ImageMagick-6.8.6-Q16\convert

などと適切なディレクトリ名とコマンド名を入れておきましょう。

この記事ではこのように書いてましたが、私の場合設定ファイル(matplotlibrc)が違う場所にありました。ファイルの場所はpythonで下を打ち込むと出てきます(ここ参考)。

import matplotlib
matplotlib.matplotlib_fname()

ImageMagickのconvert.exeの場所(C:\Program Files\ImageMagick-6.8.6-Q16\convert)もバージョンによって微妙に違うので探して指定しましょう。

 

これで最初のコードを実行すると下のgifアニメができてくれます。めでたしめでたし。

f:id:takeshi0406:20131127233021g:plain

Pythonを使って、ネットワークの時間発展の図をgifアニメとして描きたいです。networkxではグラフの描画にmatplotlib.pyplotを利用しているため、同じような方法でできないか調べてみます。

 

ただ、今回描画に使ったコードの意味もまだよく理解していないので、最初はちゃんと使えるようになるのが先決ですね。