pyplot.show()を実行した後に図を保存すると空のファイルになる
質問
次のサンプルコードは、簡単なプロットを生成し、それを '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
で表示されていないもの) を追跡します。
gcf
と
gca
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')
関連
-
[解決済み] ピクセル単位で正確なサイズの図形を指定し保存する
-
[解決済み] Pandasのデータフレームでタプルの列を分割するにはどうしたらいいですか?
-
[解決済み] 2つの線分が交差しているかどうかを確認するにはどうすればよいですか?
-
[解決済み] Pythonの要素別タプル演算(sumなど
-
[解決済み] スペースがないテキストを単語のリストに分割する方法
-
[解決済み] Ctrl-CでPythonスクリプトを終了できない
-
[解決済み] Django で全てのリクエストヘッダを取得するにはどうすれば良いですか?
-
[解決済み] CSVデータを処理する際、1行目のデータを無視する方法を教えてください。
-
[解決済み] Pandasのデータフレーム内の文字列を'date'データ型に変換するにはどうしたらいいですか?
-
[解決済み] あるメソッドが複数の引数のうち1つの引数で呼び出されたことを保証する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Pandasのデータフレームでタプルの列を分割するにはどうしたらいいですか?
-
[解決済み] Pythonです。未束縛のメソッドを束縛する?
-
[解決済み] バブルソートの宿題
-
[解決済み] Django 1.7で初期マイグレーションからマイグレートバックする方法は?
-
[解決済み] オブジェクトのリストに特定の属性値を持つオブジェクトが含まれているかどうかをチェックする
-
[解決済み] Ctrl-CでPythonスクリプトを終了できない
-
[解決済み] matplotlib でプロットの軸、目盛、ラベルの色を変更する方法
-
[解決済み] djangoのQueryDictをPythonのDictに変更するには?
-
[解決済み] Pythonの辞書にあるスレッドセーフについて
-
[解決済み] Alembicアップグレードスクリプトでインサートやアップデートを実行するにはどうすればよいですか?