pythonで数値解析 ~matplotlibを使って棒人間アニメを作ってみた~

python,数値解析,アニメーション

あんまり使い慣れてないmatplotlibのアニメーション機能について、勉強がてら棒人間アニメーションを作ってみました。

ソース

ライブラリの使い方なんてのは、マニュアル読み込むより実際に使っているところを見て動かしてみるのが早いですよね。

棒人間の四肢それぞれをグラフに設定して、フレーム間隔と同期させて動かすコードが以下になります。

アニメーションはgifファイルとして出力しています。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

fig = plt.figure()
ax = plt.axes()

theta = np.linspace(0, 4*np.pi, 128)

def update(f):
    ax.cla()        # ax をクリア
    ax.grid()       # メモリ線を設定
    plt.xlim(-1,6)
    plt.ylim(-1,6)
    ax.plot(f%5, 2, "o", c="blue")                      # 頭
    ax.plot([f%5, f%5], [1, 2], c="blue")               # 胴体
    ax.plot([f%5, f%5-0.5 + f%1], [1.75, 1], c="blue")  # 左腕
    ax.plot([f%5, f%5+0.5 - f%1], [1.75, 1], c="blue")  # 右腕
    ax.plot([f%5, f%5-0.5 + f%1], [1, 0], c="blue")     # 左足
    ax.plot([f%5, f%5+0.5 - f%1], [1, 0], c="blue")     # 右足

anim = FuncAnimation(fig = fig, func = update, frames = np.arange(0, 5, 0.05), interval=30)

anim.save("StickFigures.gif", writer="imagemagick")

出力結果

意外と簡単なコードで歩く棒人間を表現できた。

なんか目の錯覚感を感じるけど、以下参考にパラメータを調整すればもっと細やかな動きも出来そう。

解説

簡単にFuncAnimationの引数について説明。

引数説明
figFigureオブジェクト。
func各フレームで呼び出す関数。
frames上記関数に渡すデータ。
intervalフレームの更新間隔。

使い方としては、引数のinterval間隔func関数を呼び出すのでfunc関数内でグラフをplotしなおせば動的なグラフを表現できます。

このときfunc関数の引数はframesで定義した値が順次設定されます。

その他詳細については以下公式参照。