前提
ArtistAnimationでアニメーションを作成しています。
複数のフレームが同時に表示されることがあり困っています。
実現したいこと
アニメーションでフレームが重ならないようにする。
全フレームが1つになったフレームが表示されないようにする。
該当のソースコード(問題の部分のみ記載)
python
1fig, ax = plt.subplots(figsize=(22,8)) 2ax.set_xlabel("時刻") 3ax.set_ylabel("予約率") 4 5~~省略~~ 6 7ims = [] 8gra = [] 9plo = [] 10tex4 = [] 11 12for j in nichiji[:20]: 13 # 実線描画 14 im1 = ax.plot() 15 im2 = [ax.plot(~) for i in range(len(~))] 16 text4 = ax.text() 17 gra.append(im1) 18 plo.append(im2) 19 tex4.append(text4) 20 21for j in range(0, len(nichiji[:13])): 22 ims.append(sum([gra[j]] + plo[j] + [gra[j+7]] + plo[j+7] + [[tex4[j]]], [])) 23ani = animation.ArtistAnimation(fig, ims, interval=400) 24ani.save("kasane.mp4", writer="ffmpeg") 25
試したこと
最後の1行ani.save("kasane.mp4", writer="ffmpeg")を実行しないときは、写真1枚目のように全フレームが重なって表示されます。これは正しくアニメーションできている時でも同様になりました。
im1,im2,text4の3つの要素をそれぞれリストgra,plo,tex4に追加することをfor文内で行い、別のfor文でArtistAnimationの引数imsにgra,plo,tex4を追加しました。
この後にアニメーション化すると、写真2枚目のようにtext4のみが重なって表示されます。
今回はgraとploを7つずらしたものを同時に表示したいため、2つのループの繰り返し回数が7回ずれていることが原因と思われます。
また、j+7をj+1などにずらしたり、ループ回数を同じにしてanimation.ArtistAnimation(fig, ims[:-1], interval=400)
などimsの回数を変更すると、写真3枚目のようにグラフ部分でも別のフレームが重なってしまいます。
いろいろ試して分かったことは
・1つ目のforループ内でgra,plo,tex4を作成するとき、fig,ax上に重ねて表示され、ループ終了時には全要素が重なった図が生成される。
・前述の生成された図の構成要素の長さとimsの長さが異なるとき、text4やフレームが重なってしまう。
写真2枚目のtext4が重ならない状態のフレームをアニメーション化することが目標です。
何か解決策がありましたら、お伝えしていただけると幸いです。
よろしくお願いいたします。
補足情報
JupyterLab3.3.2上でコーディングしています。
追記
以下の例でも試してみました。
frames[:10]のような30ではない数にすると、やはり不足した繰り返し分のフレームが重なってしまいました。
python
1#import packages 2import matplotlib.pyplot as plt 3import numpy as np 4from matplotlib.animation import ArtistAnimation 5 6x = np.linspace(0, np.pi * 4, 100) 7 8fig, ax = plt.subplots(figsize=(4, 4)) 9frames = [] # 各フレームを構成する Artist 一覧 10for delta in np.linspace(0, np.pi, 30): 11 y = np.sin(x + delta) 12 13 # 折れ線グラフを作成する。 14 lines = ax.plot(x, y, c='b') 15 title = ax.text(0.5, 1.01, 'delta={:.2f}'.format(delta), 16 ha='center', va='bottom', 17 transform=ax.transAxes, fontsize='large') 18 frames.append(lines + [title]) 19 20# アニメーションを作成する。 21anim = ArtistAnimation(fig, frames[:10], interval=500) 22 23# gif 画像として保存する。 24anim.save('animation.gif', writer='imagemagick')

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