1. ホーム
  2. python

pyplot.show()を実行した後に図を保存すると空のファイルになる

2023-10-10 17:53:24

質問

次のサンプルコードは、簡単なプロットを生成し、それを 'fig1.pdf' に保存し、それを表示し、再び 'fig2.pdf' に保存します。最初の画像は期待通りに見えますが、2番目の画像は空白になっています (白い四角が含まれています)。実際はどうなっているのでしょうか?行の plt.show() はどうやら何かを台無しにしているようですが、何がどのように起こっているのかが分かりません!

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-1, 1, 100)
y = x**2
plt.plot(x,y)
plt.savefig('fig1.pdf')
plt.show()
plt.savefig('fig2.pdf')

どのように解決するのですか?

図を表示した後に保存したい場合、図のインスタンスを保持する必要があります。その理由は plt.savefig を呼び出した後では動作しません。 show を呼び出した後に動作しないのは、現在の数値がリセットされていることを意味します。

pyplot は、どの図形、軸などが "current"であるか(すなわち、まだ show で表示されていないもの) を追跡します。 gcfgca g c 現在 f 図と現在の a xesのインスタンスです。 plt.savefig (そして本質的に他のあらゆる pyplot メソッド) は、単に plt.gcf().savefig(...) . 言い換えれば、現在の図のインスタンスを取得し、その savefig メソッドを呼び出すのです。 同様に plt.plot は基本的に plt.gca().plot(...) .

その後 show が呼び出された後、"current" の図形と軸のリストは空です。

一般に、plot/save/show/etcのために、図と軸のインスタンスを直接使用する方が、むしろ plt.plot などを使用して暗黙のうちに現在の figure/axes を取得し、その上に描画する方がよいでしょう。を使用しても何も問題はありません。 pyplot を使うことは悪いことではありませんが (特にインタラクティブに)、それは自分自身の足を踏み外しやすくします。

使用する pyplot には plt.show() で、figure と axes オブジェクトを生成し、figure または axes メソッドを直接使用します。(例 ax.plot(x, y) の代わりに plt.plot(x, y) など) この主な利点は、明示的であることです。 あなたは、どのオブジェクトにプロットしているかを知っており、pyplotのステートマシンが何をするかについて推論する必要はありません(ステートマシンのインターフェースを理解することもそれほど難しくはありませんが)。

推奨されるやり方の例として、次のようなことを行ってください。

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-1, 1, 100)
y = x**2

fig, ax = plt.subplots()
ax.plot(x, y)
fig.savefig('fig1.pdf')
plt.show()
fig.savefig('fig2.pdf')

を使いたい場合は pyplot を使用するのであれば、図のインスタンスを取得してから show . 例えば

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-1, 1, 100)
y = x**2

plt.plot(x, y)
fig = plt.gcf()
fig.savefig('fig1.pdf')
plt.show()
fig.savefig('fig2.pdf')