matplotlib.animationでfigureオブジェクトのアニメーションを作りたい
- 評価
- クリップ 0
- VIEW 2,821
matplotlib.animation.ArtistAnimationについて
https://qiita.com/msrks/items/e264872efa062c7d6955
上記のサイトの例2を参考にして、アニメーションを作成したいと思っています。
im
に参考サイトではplt.imshow()
で作られるオブジェクトが入っていますが、plt.figure()
で作られるオブジェクトを入れたく、以下のコードを書きましたが、
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
fig = plt.figure()
def f(x, y):
return np.sin(x) + np.cos(y)
x = np.linspace(0, 2 * np.pi, 120)
y = np.linspace(0, 2 * np.pi, 100).reshape(-1, 1)
ims = []
for i in range(60):
x += np.pi / 15.
y += np.pi / 20.
# ***********
fig2 = plt.figure()
ax1 = fig2.add_subplot(2,1,1)
ax2 = fig2.add_subplot(2,1,2)
im1 = ax1.imshow(f(x, y), animated=True)
im2 = ax1.imshow(f(x, y), animated=True)
ims.append([fig2])
#*************
ani = animation.ArtistAnimation(fig, ims, interval=50, blit=True,
repeat_delay=1000)
ani.save('anim.gif', writer="imagemagick")
# ani.save('anim.mp4', writer="ffmpeg")
plt.show()
自分で変えた部分は***で囲った部分です。
実行するとIndexError: list index out of range
が出てしまうのですが、どうすれば良いかわかりますか?
追記
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
ArtistAnimation の第2引数に渡す内容は各フレームの Artist の一覧です。
つまり、以下のような2次元のリストを渡す必要があります。
[1フレーム目の Artist のリスト、2フレーム目の Artist のリスト、...]
Artist の意味は以下を参照
早く知っておきたかったmatplotlibの基礎知識、あるいは見た目の調整が捗るArtistの話 - Qiita
import matplotlib.animation as animation
import matplotlib.pyplot as plt
import numpy as np
def f(x, y):
return np.sin(x) + np.cos(y)
x = np.linspace(0, 2 * np.pi, 120)
y = np.linspace(0, 2 * np.pi, 100).reshape(-1, 1)
ims = []
fig, [ax1, ax2] = plt.subplots(2, 1)
for i in range(60):
x += np.pi / 15.
y += np.pi / 20.
img1 = ax1.imshow(f(x, y), animated=True)
img2 = ax2.imshow(f(x, y), animated=True)
ims.append([img1, img2])
ani = animation.ArtistAnimation(fig, ims, interval=50, blit=True,
repeat_delay=1000)
ani.save('anim.gif', writer="imagemagick")
# ani.save('anim.mp4', writer="ffmpeg")
plt.show()
追記
カラーバーとタイトルをアニメーションに追加するのは少しややこしいです。
タイトルが全フレームで共通であれば、ループの外で set_title() を1度だけ呼べばよいですが、フレームごとにタイトルを変更するには以下の質問の回答のようにする必要があります。
Python - matplotlibのanimationで一枚ごとに違うタイトルを付けたい|teratail
また、カラーバーをループ内でつけると、どんどんカラーバーが増えてしまうという自体が起こるため、1度だけカラーバーをつけるようにする必要があります。
Python - matplotlibのfuncanimationでgifを作成すると、カラーバーが内にどんどんできていく。|teratail
import matplotlib.animation as animation
import matplotlib.pyplot as plt
import numpy as np
def f(x, y):
return np.sin(x) + np.cos(y)
x = np.linspace(0, 2 * np.pi, 120)
y = np.linspace(0, 2 * np.pi, 100).reshape(-1, 1)
ims = []
fig, [ax1, ax2] = plt.subplots(2, 1)
fig.subplots_adjust(hspace=0.5)
for i in range(60):
x += np.pi / 15.
y += np.pi / 20.
img1 = ax1.imshow(f(x, y), animated=True)
img2 = ax2.imshow(f(x, y), animated=True)
if i == 0: # 最初のループだけカラーバーをつける
fig.colorbar(img1, ax=ax1)
fig.colorbar(img2, ax=ax2)
# タイトル
title1 = ax1.text(0.5, 1.01, 'title1 i={:.2f}'.format(i),
ha='center', va='bottom',
transform=ax1.transAxes, fontsize='large')
title2 = ax2.text(0.5, 1.01, 'title2 i={:.2f}'.format(i),
ha='center', va='bottom',
transform=ax2.transAxes, fontsize='large')
ims.append([img1, img2, title1, title2])
ani = animation.ArtistAnimation(fig, ims, interval=50, blit=True,
repeat_delay=1000)
ani.save('anim.gif', writer="imagemagick")
# ani.save('anim.mp4', writer="ffmpeg")
plt.show()
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.21%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2019/04/26 18:19
2019/04/26 18:43
2019/04/26 20:12
2019/04/27 01:18 編集
すみませんが、OS や matplotlib のバージョンはいくつでしょうか?
また確認した手順としては、追記のコードをコピペして実行し、生成された anim.gif を確認したということであっていますでしょうか
2019/04/27 13:53