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

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

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

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

受付中

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

s1920897
s1920897

総合スコア14

Python 3.x

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

2回答

0評価

0クリップ

2764閲覧

投稿2020/08/06 14:35

編集2022/01/12 10:55

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

import matplotlib.pyplot as plt import matplotlib.animation as animation import numpy as np import math from mpl_toolkits.mplot3d import Axes3D from matplotlib import animation DIM = 2 ##次元 D = 1 #pi = math.pi ##円周率 r = 1.0 ##粒子半径,アニメーションにのみ使用 dx = 2.0*r ##初期粒子間距離 h = 1.0*dx ##1~1.2の間でかける re = 3.0*h ##影響半径 ##解析範囲の設定 H = 20 ##解析範囲の高さ方向の粒子数 W = 20 ##解析範囲の高さ方向の粒子数 ρ0 = 2700.0 ##水の密度 T = 1.0 dt =0.1 TH_O = 1200 ms = 16 Rx_wall = [] ##壁粒子の位置 Ry_wall = [] Rx_in = [] ##内部粒子の位置 Ry_in = [] C_x_f = 2*re ##坩堝の左下の粒子位置x C_x_l = W*(2*r) - 2*re ##坩堝の右下の粒子番号x for i in range(0,W):##解析範囲に全ての粒子を入れるとして、その位置情報をRに入れていく for k in range(0,H): x = r + i*(2*r) y = r + k*(2*r) if x <= C_x_f and C_x_f <= y:##左上 Rx_wall.append(x) Ry_wall.append(y) if y < C_x_f:##真下 Rx_wall.append(x) Ry_wall.append(y) if C_x_l <= x and C_x_f <= y: Rx_wall.append(x) Ry_wall.append(y) N_wall = len(Rx_wall) ##壁粒子の数 for i in range(0,W):##解析範囲に全ての粒子を入れるとして、その位置情報をRに入れていく for k in range(0,H): x = r + i*(2*r) y = r + k*(2*r) if C_x_f <= x and x < W*(2*r)-C_x_f and C_x_f <= y : Rx_in.append(x) Ry_in.append(y) N_in = len(Rx_in) ##坩堝内の粒子数 N = N_in + N_wall #print(Rx_in,Ry_in) print("粒子数",N,"壁内粒子数",N_in,"壁粒子数",N_wall) plt.plot(Rx_wall,Ry_wall,color = "k",linestyle = "None",marker ="o",markersize = ms) plt.plot(Rx_in,Ry_in,color = "b",linestyle = "None",marker ="o",markersize = ms) plt.show() Rx = np.zeros(N,dtype=np.float) Ry = np.zeros(N,dtype=np.float) for i in range(N): if i < N_in: Rx[i] = Rx_in[i] Ry[i] = Ry_in[i] if N_in <= i: Rx[i] = Rx_wall[i-N_in] Ry[i] = Ry_wall[i-N_in] fig = plt.figure() ims = [] TH = np.zeros(N,dtype=np.float) r_TH_O = 5 for t in range(int(T/dt)+1): print(t*dt) for i in range(N):##温度拡散の計算、i粒子について調べる dTH = 0 for k in range(N):##k粒子がi粒子の近傍に存在するか確認 dis = math.sqrt((Rx[i]-Rx[k])**2 + (Ry[i]-Ry[k])**2) s = dis/h if s < 1.0 and 0.0 < s : 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) dTH += D*dt*2*(TH[i]-TH[k])*(fs_s/dis)*(2*r)**2 elif s < 2.0 and 1.0 <= s : fs_s = 7.0/(478.0*math.pi)*(-5.0*(3.0-s)**4.0 + 30.0*(2.0-s)**4.0) dTH += D*dt*2*(TH[i]-TH[k])*(fs_s/dis)*(2*r)**2 elif s < 3.0 and 2.0 <= s : fs_s = 7.0/(478.0*math.pi)*(-5.0*(3.0-s)**4.0) dTH += D*dt*2*(TH[i]-TH[k])*(fs_s/dis)*(2*r)**2 else: continue TH[i] += dTH for i in range(N): 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度にする TH[i]=TH_O THi = list(map(float,TH)) im = plt.scatter(Rx,Ry, vmin=min(THi), vmax=max(THi), c=THi, cmap="plasma",s = ms*9) ims.append([im]) cbar = plt.colorbar() ani = animation.ArtistAnimation(fig, ims) plt.show() ani.save('時刻歴温度分布,T=60,D=1,dt=0.1,dx=2.gif', writer='pillow')

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Python 3.x

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