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

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

新規登録して質問してみよう
ただいま回答率
85.37%
Python 3.x

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

Q&A

2回答

6339閲覧

pythonでアニメーションgifが保存できない

s1920897

総合スコア14

Python 3.x

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

0グッド

0クリップ

投稿2020/08/06 14:35

編集2020/08/07 06:21

python で熱拡散の様子がわかるアニメーションを作っています。
アニメーションを出力することはできたのですが、gif保存ができずに困っています。
どうゆう箇所をチェックすればよろしいでしょうか?
プログラミング初心者故によくわからず、検討違いかもしれませんが
pythonやanacondaを再インストールしましたが同じようなエラーが出力されました。

OS:win10
python3.8
anadonda3を利用しています。

以下がエラー文になります。
Traceback (most recent call last):
File "C:\Users\kstkh\anaconda3\lib\site-packages\matplotlib\animation.py", line 230, in saving
yield self
File "C:\Users\kstkh\anaconda3\lib\site-packages\matplotlib\animation.py", line 1152, in save
writer.grab_frame(**savefig_kwargs)
File "C:\Users\kstkh\anaconda3\lib\site-packages\matplotlib\animation.py", line 568, in grab_frame
self._frames.append(Image.frombuffer(
File "C:\Users\kstkh\anaconda3\lib\site-packages\PIL\Image.py", line 2706, in frombuffer
im = im._new(core.map_buffer(data, size, decoder_name, 0, args))
ValueError: buffer is not large enough

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "try2.py", line 116, in <module>
ani.save('時刻歴温度分布,T=60,D=1,dt=0.1,dx=2.gif', writer='pillow')
File "C:\Users\kstkh\anaconda3\lib\site-packages\matplotlib\animation.py", line 1152, in save
writer.grab_frame(**savefig_kwargs)
File "C:\Users\kstkh\anaconda3\lib\contextlib.py", line 131, in exit
self.gen.throw(type, value, traceback)
File "C:\Users\kstkh\anaconda3\lib\site-packages\matplotlib\animation.py", line 232, in saving
self.finish()
File "C:\Users\kstkh\anaconda3\lib\site-packages\matplotlib\animation.py", line 574, in finish
self._frames[0].save(
IndexError: list index out of range

以下がコードになります。
何卒よろしくお願い致します。

python

1 2import matplotlib.pyplot as plt 3import matplotlib.animation as animation 4import numpy as np 5import math 6from mpl_toolkits.mplot3d import Axes3D 7from matplotlib import animation 8 9 10DIM = 2 ##次元 11D = 1 12 13#pi = math.pi ##円周率 14r = 1.0 ##粒子半径,アニメーションにのみ使用 15dx = 2.0*r ##初期粒子間距離 16h = 1.0*dx ##1~1.2の間でかける 17re = 3.0*h ##影響半径 18##解析範囲の設定 19H = 20 ##解析範囲の高さ方向の粒子数 20W = 20 ##解析範囲の高さ方向の粒子数 21ρ0 = 2700.0 ##水の密度 22T = 1.0 23dt =0.1 24TH_O = 1200 25ms = 16 26 27Rx_wall = [] ##壁粒子の位置 28Ry_wall = [] 29 30Rx_in = [] ##内部粒子の位置 31Ry_in = [] 32 33C_x_f = 2*re ##坩堝の左下の粒子位置x 34C_x_l = W*(2*r) - 2*re ##坩堝の右下の粒子番号x 35 36 37for i in range(0,W):##解析範囲に全ての粒子を入れるとして、その位置情報をRに入れていく 38 for k in range(0,H): 39 x = r + i*(2*r) 40 y = r + k*(2*r) 41 if x <= C_x_f and C_x_f <= y:##左上 42 Rx_wall.append(x) 43 Ry_wall.append(y) 44 if y < C_x_f:##真下 45 Rx_wall.append(x) 46 Ry_wall.append(y) 47 if C_x_l <= x and C_x_f <= y: 48 Rx_wall.append(x) 49 Ry_wall.append(y) 50 51N_wall = len(Rx_wall) ##壁粒子の数 52 53for i in range(0,W):##解析範囲に全ての粒子を入れるとして、その位置情報をRに入れていく 54 for k in range(0,H): 55 x = r + i*(2*r) 56 y = r + k*(2*r) 57 if C_x_f <= x and x < W*(2*r)-C_x_f and C_x_f <= y : 58 Rx_in.append(x) 59 Ry_in.append(y) 60 61N_in = len(Rx_in) ##坩堝内の粒子数 62N = N_in + N_wall 63#print(Rx_in,Ry_in) 64print("粒子数",N,"壁内粒子数",N_in,"壁粒子数",N_wall) 65plt.plot(Rx_wall,Ry_wall,color = "k",linestyle = "None",marker ="o",markersize = ms) 66plt.plot(Rx_in,Ry_in,color = "b",linestyle = "None",marker ="o",markersize = ms) 67plt.show() 68 69 70 71 72Rx = np.zeros(N,dtype=np.float) 73Ry = np.zeros(N,dtype=np.float) 74for i in range(N): 75 if i < N_in: 76 Rx[i] = Rx_in[i] 77 Ry[i] = Ry_in[i] 78 if N_in <= i: 79 Rx[i] = Rx_wall[i-N_in] 80 Ry[i] = Ry_wall[i-N_in] 81fig = plt.figure() 82ims = [] 83 84TH = np.zeros(N,dtype=np.float) 85r_TH_O = 5 86 87for t in range(int(T/dt)+1): 88 print(t*dt) 89 90 for i in range(N):##温度拡散の計算、i粒子について調べる 91 dTH = 0 92 for k in range(N):##k粒子がi粒子の近傍に存在するか確認 93 dis = math.sqrt((Rx[i]-Rx[k])**2 + (Ry[i]-Ry[k])**2) 94 s = dis/h 95 if s < 1.0 and 0.0 < s : 96 fs_s = 7.0/(478.0*math.pi)*(-5.0*(3.0-s)**4.0 + 30.0*(2.0-s)**4.0 -75.0*(1.0-s)**4.0) 97 dTH += D*dt*2*(TH[i]-TH[k])*(fs_s/dis)*(2*r)**2 98 elif s < 2.0 and 1.0 <= s : 99 fs_s = 7.0/(478.0*math.pi)*(-5.0*(3.0-s)**4.0 + 30.0*(2.0-s)**4.0) 100 dTH += D*dt*2*(TH[i]-TH[k])*(fs_s/dis)*(2*r)**2 101 elif s < 3.0 and 2.0 <= s : 102 fs_s = 7.0/(478.0*math.pi)*(-5.0*(3.0-s)**4.0) 103 dTH += D*dt*2*(TH[i]-TH[k])*(fs_s/dis)*(2*r)**2 104 else: 105 continue 106 TH[i] += dTH 107 for i in range(N): 108 if Ry[i] >= H*(2*r)-2*r and r+r*W-r_TH_O <= Rx[i] and Rx[i] <= r+r*W+r_TH_O:##坩堝の照射範囲内にある粒子を強制的に1200度にする 109 TH[i]=TH_O 110 THi = list(map(float,TH)) 111 im = plt.scatter(Rx,Ry, vmin=min(THi), vmax=max(THi), c=THi, cmap="plasma",s = ms*9) 112 ims.append([im]) 113 114cbar = plt.colorbar() 115ani = animation.ArtistAnimation(fig, ims) 116plt.show() 117ani.save('時刻歴温度分布,T=60,D=1,dt=0.1,dx=2.gif', writer='pillow') 118 119

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ValueError: buffer is not large enough

Error at save animation with pillow #15678
によると、Matplotlib 3.3あたりで修正されてるようです

matplotlib 3.3.0
は、この質問がされたより1ヵ月くらい前にリリースされてました

投稿2021/12/21 03:02

jbpb0

総合スコア7653

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

IndexError: list index out of range

はlistの範囲外をアクセスしているために発生しているエラーです。

どうゆう箇所をチェックすればよろしいでしょうか?

コード上でlistの要素にアクセスしているすべての場所で、範囲外をアクセスしているところがないか確認すればよいです。

投稿2020/08/06 14:45

can110

総合スコア38339

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

s1920897

2020/08/06 14:52 編集

申し訳ございません。エラー文は以下でした。一部のみコピペしていたようです。 ani.saveの段をコメントアウトするとしっかり動きます(保存はできませんが)。 Traceback (most recent call last): File "C:\Users\kstkh\anaconda3\lib\site-packages\matplotlib\animation.py", line 230, in saving yield self File "C:\Users\kstkh\anaconda3\lib\site-packages\matplotlib\animation.py", line 1152, in save writer.grab_frame(**savefig_kwargs) File "C:\Users\kstkh\anaconda3\lib\site-packages\matplotlib\animation.py", line 568, in grab_frame self._frames.append(Image.frombuffer( File "C:\Users\kstkh\anaconda3\lib\site-packages\PIL\Image.py", line 2706, in frombuffer im = im._new(core.map_buffer(data, size, decoder_name, 0, args)) ValueError: buffer is not large enough During handling of the above exception, another exception occurred: Traceback (most recent call last): File "try2.py", line 116, in <module> ani.save('時刻歴温度分布,T=60,D=1,dt=0.1,dx=2.gif', writer='pillow') File "C:\Users\kstkh\anaconda3\lib\site-packages\matplotlib\animation.py", line 1152, in save writer.grab_frame(**savefig_kwargs) File "C:\Users\kstkh\anaconda3\lib\contextlib.py", line 131, in __exit__ self.gen.throw(type, value, traceback) File "C:\Users\kstkh\anaconda3\lib\site-packages\matplotlib\animation.py", line 232, in saving self.finish() File "C:\Users\kstkh\anaconda3\lib\site-packages\matplotlib\animation.py", line 574, in finish self._frames[0].save( IndexError: list index out of range
can110

2020/08/06 15:02

提示コードでエラー発生せず、アニメーションするgifができました。 OSやPython、使用しているモジュールのバージョンなどを質問本文に記載するとよいかと思われます。
s1920897

2020/08/07 06:23 編集

確認ありがとうございます。 わかりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

アカウントをお持ちの方は

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問