はじめに
本記事は筆者が「ぬるぬる動くグラフが作りてえな~」と思って作ったものの副産物です。
解説に誤りがあるかもしれませんので見つけたら教えてください。
使用ライブラリ
・matplotlib
- .animation
- .pyplot
・numpy
ライブラリ説明
・matplotlib
言わずと知れたグラフ描画ライブラリです。
・.animation
グラフを更新するモジュールみたいです。
・.pyplot
グラフを描画するモジュールみたいです。
・numpy
言わずと知れた配列・数学関数のライブラリです。
ソースコード
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import animation
n = 50
arry = np.linspace(0, 2*np.pi, n)
x = np.cos(arry)
y = np.sin(arry)
fig, axes = plt.subplots()
ims = []
z = [0 for _ in range(n)]
cline = np.linspace(-1, 1, n)
axes.plot(x,y, color='0.5')
axes.plot(cline,z, color='0.9')
axes.plot(z,cline, color='0.9')
axes.set_xlabel('x')
axes.set_ylabel('y')
for i in range(n):
p1 = axes.plot(x[i], y[i], marker = 'o', markersize = 20)
p2 = axes.plot(x[i], 0, marker = 'o', markersize = 20)
p3 = axes.plot(0, y[i], marker = 'o', markersize = 20)
ims.append(p1 + p2 + p3)
ani = animation.ArtistAnimation(fig, ims, interval=50)
plt.show()
上から順に解説
import節は飛ばします
n = 50
arry = np.linspace(0, 2*np.pi, n)
x = np.cos(arry)
y = np.sin(arry)
円を描く準備をしています。
0~2πまでの数値を50分割で用意して、xy座標を求めます。
fig, axes = plt.subplots()
ims = []
z = [0 for _ in range(n)]
cline = np.linspace(-1, 1, n)
グラフの準備をしています。
fig, axes はグラフの描画領域にあたるものです。
ims にはアニメーションのパーツとなるグラフを格納させます。
z と cline は背景の円と縦横線を描くための配列です。
axes.plot(x,y, color='0.5')
axes.plot(cline,z, color='0.9')
axes.plot(z,cline, color='0.9')
axes.set_xlabel('x')
axes.set_ylabel('y')
上の用意を元に背景等をセットしています。
for i in range(n):
p1 = axes.plot(x[i], y[i], marker = 'o', markersize = 20)
p2 = axes.plot(x[i], 0, marker = 'o', markersize = 20)
p3 = axes.plot(0, y[i], marker = 'o', markersize = 20)
ims.append(p1 + p2 + p3)
グラフのパーツを作成しています。
p1,p2,p3はそれぞれゲーミング円運動と写像を1ステップ1フレームで作成します。
それをimsに格納していきます。
ani = animation.ArtistAnimation(fig, ims, interval=50)
plt.show()
グラフを表示させます。
ani で描くグラフと更新頻度を設定し、plt.show()で表示します。
また、
ani.save('party_plot.gif', writer='pillow')
と追加することで簡単にGIF化できます。
おわりに
クソアプリの元にできそうな気がするんですが、もう一つ何か欲しいですね。
パッと思いつくのは例のゲーミング鳥あたりですが、関数ゲーミング鳥は先駆者がいらっしゃいました。
私は発想力が貧困なので今はこれが限界です。
何か思いついたら追記するかもしれません。