ipythonで表示せずにpylab.savefigを呼び出す


111

IPython Notebook内に表示せずに、ファイル内に図を作成する必要があります。私は間の相互作用を明確にないですIPythonし、matplotlib.pylabこの点インチ しかし、pylab.savefig("test.png")現在のFigure を呼び出すと、に保存されるだけでなく、表示されtest.pngます。大量のプロットファイルの作成を自動化する場合、これは望ましくないことがよくあります。または、別のアプリによる外部処理用の中間ファイルが必要な場合。

これがmatplotlibまたはIPythonノートブックの質問かどうかはわかりません。


@staticfloatによる回答は、ノートブック内にない場合でも、JuliaLangを介してmatplotlibを使用する場合でも機能しました。使用ioff
Vass

回答:


173

これはmatplotlibの質問であり、ユーザーに表示されないバックエンド、たとえば「Agg」を使用することでこれを回避できます。

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt

plt.plot([1,2,3])
plt.savefig('/tmp/test.png')

編集:プロットを表示する機能を失いたくない場合は、インタラクティブモードをオフにしplt.show()、プロットを表示する準備ができたときにのみ呼び出します。

import matplotlib.pyplot as plt

# Turn interactive plotting off
plt.ioff()

# Create a new figure, plot into it, then close it so it never gets displayed
fig = plt.figure()
plt.plot([1,2,3])
plt.savefig('/tmp/test0.png')
plt.close(fig)

# Create a new figure, plot into it, then don't close it so it does get displayed
plt.figure()
plt.plot([1,3,2])
plt.savefig('/tmp/test1.png')

# Display all "open" (non-closed) figures
plt.show()

2
OK-しかし、私は一般的にインラインプロットをiPython内に保持したいと思います。あなたが提案することは、バックエンドで完全な切り替えを行う場合にうまく機能します。問題は、(インラインを表示せずに)数値を保存するという例外的なケースで、インラインプロットの一般的な状況をどのように考慮できるかです。あなたの提案で、モジュールをリロードしてバックエンドを一時的に変更しようとしましたが、成功しませんでした。iPythonノートブックセッション内でバックエンドを一時的に変更する方法に関するアイデアはありますか?
tnt 2013年

1
質問を更新して、インタラクティブなプロットとclose()and show()コマンドについて説明します。これで問題が解決するはずです。あなたが発見したように、その場でバックエンドを変更することはサポートされていません。
staticfloat 2013年

3
素晴らしいフィードバックをありがとうございます。plt.close(fig)が私の必要なキーコマンドのようです。ioffは操作に影響を与えていないようなので、まだはっきりしていません。しかし、私はおそらく何かを逃しています。再度、感謝します。
2013

1
私が提供したレシピは一般的なものです。ipythonノートブックで作業していない場合、コマンドラインでplt.plot()は、対話モードがオンの場合に呼び出すとすぐにipythonの図がプロットされるため、plt.ioff()は図の画面のちらつきを抑えるのに重要です。インタラクティブモードをオフにすると、プロットの表示がまで延期されますplt.show()。ipythonノートブックを使用しているため、インタラクティブモードの扱いは異なります。
staticfloat 2013

私にとっては、matplotlib.use('Agg')一人でトリックを行いました。私は、任意の必要はありませんでしたplt.show()か、plt.ioff()すべての私のコードで。
Zhanwen Chen

67

plt.ioff()またはplt.show()(使用する場合%matplotlib inline)は必要ありません。上記のコードはなしでテストできますplt.ioff()plt.close()重要な役割を持っています。これを試してください:

%matplotlib inline
import pylab as plt

# It doesn't matter you add line below. You can even replace it by 'plt.ion()', but you will see no changes.
## plt.ioff()

# Create a new figure, plot into it, then close it so it never gets displayed
fig = plt.figure()
plt.plot([1,2,3])
plt.savefig('test0.png')
plt.close(fig)

# Create a new figure, plot into it, then don't close it so it does get displayed
fig2 = plt.figure()
plt.plot([1,3,2])
plt.savefig('test1.png')

このコードをiPythonで実行すると2番目のプロットが表示さplt.close(fig2)れ、最後に追加 しても何も表示されません。

つまりplt.close(fig)、で図形を閉じると表示されません。


5
確かに良い解決策です!ループで多くのプロットを生成して保存します。plt.ioff私が得ますRuntimeWarning: More than 20 figures have been opened...plt.close解決しました。
長崎
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.