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

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

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

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

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

Q&A

解決済

2回答

1444閲覧

【Python】Matplotlib -- フレーム画像を保存する方法がわからない

tetsutail_study

総合スコア25

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

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

0グッド

0クリップ

投稿2021/09/09 13:51

前提・実現したいこと

以下のコード(該当部分だけ切り出し)では、matplotlib.animation.FFMpegWriter()を使用して0~3000フレーム分のプロットを一連の動画にしています。やりたいことはこのfor文の中で、フレームを一枚一枚画像として保存することです。どういった処理を加えたら実現できるか教えてください!

該当のソースコード

python

1writer = FFMpegWriter(fps=fps, codec=codec) 2 with writer.saving(fig, output_name, dpi=dpi): 3 writer.grab_frame() 4 for index, _ in enumerate(trange(n_frames), start=0): 5 coords = xyp[index, :, :2] 6 coords[xyp[index, :, 2] < pcutoff] = np.nan 7 scat.set_offsets(coords) 8 if ind_links: 9 segs = coords[tuple(zip(*tuple(ind_links))), :].swapaxes(0, 1) 10 coll.set_segments(segs) 11 writer.grab_frame() 12 plt.close(fig) 13 plt.switch_backend(prev_backend)

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

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

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

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

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

guest

回答2

0

別解ですが、次のように FFMpegFileWriter を使い、frame_prefixに None 以外の値を設定することによっても、カレントディレクトリに各フレームの静止画像が保存されます。

python

1import os 2from pathlib import Path 3 4from matplotlib.animation import FFMpegFileWriter 5 6writer = FFMpegFileWriter(fps=fps, codec=codec) 7writer.setup(fig, output_name, dpi=dpi, frame_prefix=str(Path(os.getcwd(), "tmp"))) 8for index, _ in enumerate(trange(n_frames), start=0): 9 coords = xyp[index, :, :2] 10 coords[xyp[index, :, 2] < pcutoff] = np.nan 11 scat.set_offsets(coords) 12 if ind_links: 13 segs = coords[tuple(zip(*tuple(ind_links))), :].swapaxes(0, 1) 14 coll.set_segments(segs) 15 writer.grab_frame() 16#writer.finish()

plt.savefig() を使う方法では、動画ファイルの作成と静止画像の作成は、同じ Figure オブジェクトからそれぞれ別に行われますが、FFMpegFileWriter を使った方法では、動画ファイルを構成する各フレーム画像をいったん静止画像に保存した後、その静止画像から動画ファイルを作成する方法をとります。
そのため FFMpegFileWriter を使った方法では、静止画像の解像度は動画ファイルの解像度と同一になります。

FFMpegFileWriter のソースを見た限りでは、frame_prefix にディレクトリのパスを指定することによって、静止画像はそこに保存されるはずなのですが、実行結果はそうはなっていません。上のコードではカレントディレクトリの tmp ディレクトリ内に保存するよう指定しているつもりなのですが、実行結果はそうなっていません。

また、FFMpegFileWriter のソースにつけられたコメントでは、frame_prefix に None 以外の値を設定すると、書き出された静止画像は削除されないはずなのですが、実行結果はそうなっていません。
このため、writer.finish()をコメントアウトして、静止画像が削除されないようにしています。そのために動画ファイルも作成されていません。

投稿2021/09/15 14:44

etherbeg

総合スコア1195

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

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

0

ベストアンサー

回答になっているかどうかわからないのですが…

matplotlib の公式ドキュメントのこちらのサンプルコード

Animated image using a precomputed list of images — Matplotlib 3.4.3 documentation

plt.savefig()を挿入することによって、各フレームを静止画像として保存することができました。

python

1import numpy as np 2import matplotlib.pyplot as plt 3import matplotlib.animation as animation 4 5fig, ax = plt.subplots() 6 7 8def f(x, y): 9 return np.sin(x) + np.cos(y) 10 11x = np.linspace(0, 2 * np.pi, 120) 12y = np.linspace(0, 2 * np.pi, 100).reshape(-1, 1) 13 14# ims is a list of lists, each row is a list of artists to draw in the 15# current frame; here we are just animating one artist, the image, in 16# each frame 17ims = [] 18for i in range(60): 19 x += np.pi / 15. 20 y += np.pi / 20. 21 im = ax.imshow(f(x, y), animated=True) 22 plt.savefig(f"{i}.png") # <= この1行を挿入しました 23 if i == 0: 24 ax.imshow(f(x, y)) # show an initial one first 25 ims.append([im]) 26 27ani = animation.ArtistAnimation(fig, ims, interval=50, blit=True, 28 repeat_delay=1000) 29 30# To save the animation, use e.g. 31# 32# ani.save("movie.gif") 33# 34# or 35# 36# writer = animation.FFMpegWriter( 37# fps=15, metadata=dict(artist='Me'), bitrate=1800) 38# ani.save("movie.mp4", writer=writer) 39 40plt.show()

投稿2021/09/09 17:00

etherbeg

総合スコア1195

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

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

tetsutail_study

2021/09/10 04:45

for文の最後にplt.savefig(f"{i}.png") 入れたら保存できました! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問