2013-03-30 9 views
50

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

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

答えて

79

これはmatplotlibの質問です。この問題を回避するには、ユーザーには表示されないバックエンドを使用します。 「AGG」:

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

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

EDIT:あなたはプロットを表示する機能を失いたくない場合は、Interactive Modeをオフにし、そしてあなたがプロット表示する準備ができている場合にのみ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

- しかし、私は一般的にiPython内でインラインプロットを保持したいと思います。あなたが提案するものは、バックエンドで完全なスイッチを作ればうまく動作します。問題は、インラインプロットの一般的な状況を、インラインで表示せずに図を保存する例外的なケースでどのように許可するかです。あなたの提案で、私はモジュールをリロードし、バックエンドを一時的に変更しようとしましたが、成功しませんでした。 iPythonノートブックセッション内でバックエンドを一時的に変更する方法に関するアイデアはありますか? – tnt

+1

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

+3

素晴らしいフィードバックをいただきありがとうございます。 plt.close(fig)が私の必要性の鍵となるようです。私はそれが操作に影響を与えないように見えるので、ioffでまだ明確ではない。しかし、私はおそらく何かが不足しています。再度、感謝します。 – tnt

25

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)で図を閉じると、それは表示されません。

+0

より良い解決策! – PlagTag

+0

本当に良い解決策!私は生成し、ループで多くのプロットを保存します。 'plt.ioff'では' RuntimeWarning:20人以上の人物が公開されました... 'というメッセージが表示されます。 'plt.close'はそれを解決しました。 – Nagasaki45

関連する問題