[matplotlib 3D] 33. 散布図アニメーション

matplotlib Animation
スポンサーリンク
スポンサーリンク

はじめに

mplot3dとFuncAnimationにより、散布図アニメーションを作成する。

スポンサーリンク

コード

スポンサーリンク

解説

x,y,z = [],[],[] # 描画データ
ax.cla()
ax.set_xlim(-12, 12)
ax.set_ylim(-12, 12)
ax.set_zlim(-12, 12)
ax.set_aspect('equal')

x,y,zの空のリストを作成。
xlimなどで表示範囲の設定。
set_aspect(‘equal’)でxyz軸のアスペクト比を揃えている。

def animate(i): 
u = np.linspace(0, 2 * np.pi, 100)
v = np.linspace(0, np.pi, 10)
for j in range(0,len(v)):
x= 10 * np.outer(np.cos(u[i]), np.sin(v[j]))
y = 10 * np.outer(np.sin(u[i]), np.sin(v[j]))
z = 10* np.outer(np.ones(np.size(u[i])), np.cos(v[j]))
np.append(x,x)
np.append(y,y)
np.append(z,z)
# 描画
ax.scatter( x, y, z,s=40,alpha=0.3, marker="o")

球のデータは極座標的に求めることができる。[1]
np.append(x,x)で古いxに新しいxを追加している。[2]

ax.scatterで順次プロットしていく。alphaは透明度の設定で1で不透明、0で透明となる。[3]

animate内でjがlen(v)=10回繰り返されるので、まず、縦に10個のプロットができる。それが、後述のFuncAnimationのframesの数(=100)だけ繰り返されるので、u[0]〜u[2π]=1周、回ることになる。

ani =animation.FuncAnimation(fig, animate,frames=100, interval=100) 

figでanimateを実行する。frames=100はanimateのiが100までという意味、でinterval=100は100msで順次次の絵にしていくので100 ms*100で10 sの動画となる。

animateの内部でax.set_aspect(‘equal’)とした場合

順次、軸の設定が変化していくアニメーションが得られる。

スポンサーリンク

参考

  1. [matplotlib 3D] 18. 3D surfaceプロット2
  2. 配列末尾へ要素を追加するNumPyのappendの使い方 – DeepAge
  3. Matplotlib – 3次元散布図のアニメーションプロット|teratail

コメント