下のプログラムを実行するときに、movie.save()の文をコメントアウトすると何も出ませんが、有効にするとlist index out of rangeのエラーが出てきてしまいます。
#プログラム
python
1 2import tkinter as tk 3from scipy.spatial import Delaunay, \ 4 delaunay_plot_2d, Voronoi, voronoi_plot_2d, ConvexHull 5import matplotlib.pyplot as plt 6from matplotlib.backends.backend_tkagg import ( \ 7 FigureCanvasTkAgg, NavigationToolbar2Tk) 8import numpy as np 9import matplotlib.animation as ani 10 11root = tk.Tk()#ウインドの作成 12root.title("Sheep and dog")#ウインドのタイトル 13root.geometry("800x700") #ウインドの大きさ 14 15#シミュレーションのサイズ 16n = 20 #生物Aの数 17K = 10 #シミュレーションの時間ステップ数 18 19np.random.seed(77) 20x_i = np.random.randint(-48., 48., (n, 2)) #生物Aの初期値。n×2行列 21z = np.array([-50., -50.]) #生物Bの初期値 22 23fig = plt.Figure() #描画の用意 24ax = fig.add_subplot(111) 25ax.set_xlim(-50,50) 26ax.set_ylim(-50,50) 27ax.set_xlabel("x")#x軸のラベル 28ax.set_ylabel("y")#y軸のラベル 29line = ax.scatter(x_i[0], x_i[1]) 30 31def animate(i): 32 line.set_xdata(np.array(x_room[i,:,0])) 33 line.set_ydata(np.array(x_room[i,:,1])) 34 frame=f"{i:.2f}" 35 ax.set_title('frames= '+str(frame)) 36 return line 37 38x_room, z_room = [], [] 39 40for k in range(K): 41 if len(x_room) == 0: 42 x_room.append(x_i) 43 z_room.append(z) 44 45 xk = x_i + np.random.rand 46 zk = z + np.random.rand 47 48 x_room.append(xk) 49 z_room.append(zk) 50 51 x_i = xk 52 z = zk 53 print() 54 55print(f'{len(x_room)} {len(x_room[0])} {len(x_room[0][0])}') 56 57#tkinterのウインド上部にグラフを表示する 58canvas = FigureCanvasTkAgg(fig, master=root) 59movie= ani.FuncAnimation(fig, animate,interval=10,frames=1) 60canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1) 61 62movie.save("animation_test.gif",writer='pillow')
errorはdef文内の
python
1line.set_xdata(np.array(x_room[i,:,0]))
でlist index out of rangeと書いてあるのですが、x_roomは11×20×2行列なので要素を超えていないのではないかと思っています。
また、
movie.save("animation_test.gif",writer='pillow')
をコメントアウトしているとそのエラーは出ず、代わりに
UserWarning: Animation was deleted without rendering anything. This is most likely unintended. To prevent deletion, assign the Animation to a variable that exists for as long as you need the Animation. warnings.warn(
とだけ出ます。コメントアウトを外すとlist index out of rangeが出ます。この対処法についてアドバイスをお願いします。
x_room が 2-dim numpy.ndarray のリストになっています。
x_room = np.dstack(x_room)
とすれば 3-dim array に変換されます。ただ、
line.set_xdata(...)
で、 'PathCollection' object has no attribute 'set_xdata' というエラーになります。
melianさん、大変丁寧にご回答して頂き本当にありがとうございます。エラーを解決することができ、無事アニメーションが保存されました。
重ねて質問したいのですが、アニメーションにzの時間変化も組み込むにはどうプログラム文を変更すれば良いでしょうか。関数animateのscatの引数をx_room[i, :, :] + z_room[i]にしてみたのですが全然違う結果になってしまいました。zは見やすくするためにx_iと色を変えた点で表したいと思っています。
回答1件
あなたの回答
tips
プレビュー