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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

408閲覧

Python:ArtistAnimationでのアニメーション作成

Acy

総合スコア0

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2022/08/31 02:40

編集2022/08/31 03:18

前提

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')

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問