質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

解決済

Animationを保存しようとするとlist index out of rangeとなってしまう。

miyavi-177
miyavi-177

総合スコア1

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

1回答

0評価

0クリップ

492閲覧

投稿2021/12/16 02:57

下のプログラムを実行するときに、movie.save()の文をコメントアウトすると何も出ませんが、有効にするとlist index out of rangeのエラーが出てきてしまいます。

#プログラム

python

import tkinter as tk from scipy.spatial import Delaunay, \ delaunay_plot_2d, Voronoi, voronoi_plot_2d, ConvexHull import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import ( \ FigureCanvasTkAgg, NavigationToolbar2Tk) import numpy as np import matplotlib.animation as ani root = tk.Tk()#ウインドの作成 root.title("Sheep and dog")#ウインドのタイトル root.geometry("800x700") #ウインドの大きさ #シミュレーションのサイズ n = 20 #生物Aの数 K = 10 #シミュレーションの時間ステップ数 np.random.seed(77) x_i = np.random.randint(-48., 48., (n, 2)) #生物Aの初期値。n×2行列 z = np.array([-50., -50.]) #生物Bの初期値 fig = plt.Figure() #描画の用意 ax = fig.add_subplot(111) ax.set_xlim(-50,50) ax.set_ylim(-50,50) ax.set_xlabel("x")#x軸のラベル ax.set_ylabel("y")#y軸のラベル line = ax.scatter(x_i[0], x_i[1]) def animate(i): line.set_xdata(np.array(x_room[i,:,0])) line.set_ydata(np.array(x_room[i,:,1])) frame=f"{i:.2f}" ax.set_title('frames= '+str(frame)) return line x_room, z_room = [], [] for k in range(K): if len(x_room) == 0: x_room.append(x_i) z_room.append(z) xk = x_i + np.random.rand zk = z + np.random.rand x_room.append(xk) z_room.append(zk) x_i = xk z = zk print() print(f'{len(x_room)} {len(x_room[0])} {len(x_room[0][0])}') #tkinterのウインド上部にグラフを表示する canvas = FigureCanvasTkAgg(fig, master=root) movie= ani.FuncAnimation(fig, animate,interval=10,frames=1) canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1) movie.save("animation_test.gif",writer='pillow')

errorはdef文内の

python

line.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が出ます。この対処法についてアドバイスをお願いします。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

melian

2021/12/16 03:20

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' というエラーになります。
miyavi-177

2021/12/17 14:57

melianさん、大変丁寧にご回答して頂き本当にありがとうございます。エラーを解決することができ、無事アニメーションが保存されました。 重ねて質問したいのですが、アニメーションにzの時間変化も組み込むにはどうプログラム文を変更すれば良いでしょうか。関数animateのscatの引数をx_room[i, :, :] + z_room[i]にしてみたのですが全然違う結果になってしまいました。zは見やすくするためにx_iと色を変えた点で表したいと思っています。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。