はじめに
matplotlib FuncAnimationによるスーパー楕円のアニメーションについて説明する。
コード
コードをダウンロード(.pyファイル)
コードをダウンロード(.ipynbファイル)
解説
モジュールのインポート
バージョン
グリッドと軸ラベル、アスペクト比の設定
スーパー楕円データの生成
スーパー楕円は↓の式のように定義される。
$$|\frac{x}{a}|^n + |\frac{y}{b}|^n = 1$$今回は、媒介変数でスーパー楕円はデータを生成する。
θ(t)を0〜2π,aがy=0におけるx軸の半径,bがx=0におけるy軸の半径となる。
cとsをそれぞれcos(t)とsin(t)としている。
スーパー楕円を媒介変数表示すると↓のようになる。
$$x(t) = |cost|^\frac{2}{n}\cdot a sgn(cost)\\y(t) = |sint|^\frac{2}{n}\cdot b sgn(sint)$$sgn()は符号関数で()内にマイナスの値が入るときは-1、プラスの値のときは+1, ゼロのときは0を返してくれる。コードではnp.sign()を用いている。
この式のnを順次変化させるアニメーションを作成する。
アニメーションを表示するための設定
アニメーションで表示したいグラフを入れる空のリスト、Superellipses =[]をつくる。
アニメーションの設定
アニメーションでは古いプロットを消す必要があるので、
グラフのリスト(Superellipses)にグラフが入っている場合は、pop().remove()で消す。
x,yでnの値が異なるデータを順次作成し、Superellipse, = plt.plot(x, y, ‘g-‘, lw=2)
で、スーパー楕円を表示する。g-で緑線での表示となる。
作成したプロットを空のリスト(Superellipses)に入れることでアニメーションを表示できる。
ax.set_title(“Superellipse, parameter $n$= “+str(n[num])[:4])でタイトルにアニメーションで変化するnの値をリアルタイムに表示する。[:4]とすることで小数点以下が大量に表示されるのを防いでいる。
アニメーションの表示
FuncAnimationでanimationの表示。updateを100step実行してアニメーションとする。intervalは100 ms なので10秒のアニメーションとなる。
HTML(ani.to_html5_video())でjupyter notebook上にアニメーションを表示できる。
アニメーションの保存
ani.save(‘filename.mp4’, writer=”ffmpeg”,dpi=dpi)でアニメーションを保存することができる。dpiを設定することで指定の解像度での保存が可能。
コメント
[…] [matplotlib animation] 17. スーパー楕円(Superellipse)matplotlib FuncAnimationによるスーパー楕円のアニメーションsabopy.com2018.12.25 […]