Axes3Dで作成したグラフをArtistAnimationで動かしたいのですが、現在のコードではうまくアニメーションが出力されません。
コードを実行すると、画像のような各フレームのグラフが100個のウィンドウとして個別に出力されてしまいます。
ソースコード
Python
1import numpy as np 2import matplotlib.pyplot as plt 3from mpl_toolkits.mplot3d import Axes3D 4from matplotlib.animation import ArtistAnimation 5 6N=100 7frames = [] 8for i in range(N): 9 # (x,y)データを作成 10 a1= np.loadtxt("4000rpm_wUV_6,52-heimen.csv", delimiter=",", usecols=(0) ) 11 a= a1[i] 12 b1= np.loadtxt("4000rpm_wUV_6,52-heimen.csv", delimiter=",", usecols=(1) ) 13 b= b1[i] 14 c1= np.loadtxt("4000rpm_wUV_6,52-heimen.csv", delimiter=",", usecols=(2) ) 15 c= c1[i] 16 h1= np.loadtxt("4000rpm_wUV_6,52-heimen.csv", delimiter=",", usecols=(3) ) 17 h= h1[i] 18 19 #x,yの範囲 20 x = np.linspace(-45, 45, 10) 21 y = np.linspace(-45, 45, 10) 22 23 # 格子点を作成 24 X, Y = np.meshgrid(x, y) 25 # Zの作成 26 Z = (h-a*X-b*Y)/c 27 28 # 3Dでプロット 29 fig = plt.figure() 30 ax = Axes3D(fig) 31 32 ax.set_xlim([-45,45]) 33 ax.set_ylim([-45,45]) 34 ax.set_zlim([-45,45]) 35 36 # 軸ラベル 37 ax.set_xlabel("X軸: 中心からの距離[mm]", fontsize = 16, fontname="MS Gothic") 38 ax.set_ylabel("Y軸: 中心からの距離[mm]", fontsize = 16, fontname="MS Gothic") 39 ax.set_zlabel("Z軸: 変位[μm]", fontsize = 16, fontname="MS Gothic") 40 41 frame = ax.plot_surface(X, Y, Z, color="tomato",antialiased=False, alpha=0.3) 42 frames.append(frame) 43 44ani = ArtistAnimation(fig, frames, interval=100) 45 46# 描画 47plt.show()
> # 3Dでプロット
fig = plt.figure()
ax = Axes3D(fig)
を「for i in range(N):」よりも前に移して、
frames.append(frame)
↓ 修正
frames.append([frame])
で、どうでしょうか?
質問内容とは関係ありませんが、下記の行は変数「i」と「Z」に関係しないので、「for i in range(N):」のループ内で毎回同じことをやってますよね
同じことを何回もやるのは時間のムダなので、それらは「for i in range(N):」よりも前に移した方がいいですよ
・「np.loadtxt」の行
・「#x,yの範囲」の下
・「# 格子点を作成」の下
・「ax.set_*lim」の行
・「# 軸ラベル」の下
コメントしていただきありがとうございます。
FuncAnimationを使用して目的のアニメーションが得られましたので、今後ArtistAnimationを使用する際の参考にさせていただきます。

回答1件
あなたの回答
tips
プレビュー