web-dev-qa-db-ja.com

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

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

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

77
tnt

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

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

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

EDIT:プロットを表示する機能を失いたくない場合は、 インタラクティブモード をオフにして、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()
133
staticfloat

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

46