[python] 將繪圖保存為圖像文件,而不是使用Matplotlib顯示它



Answers

解決方案是:

pylab.savefig('foo.png')
Question

我正在寫一個快速而骯髒的腳本來即時生成劇情。 我使用下面的代碼(來自Matplotlib文檔)作為起點:

from pylab import figure, axes, pie, title, show

# Make a square figure and axes
figure(1, figsize=(6, 6))
ax = axes([0.1, 0.1, 0.8, 0.8])

labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
fracs = [15, 30, 45, 10]

explode = (0, 0.05, 0, 0)
pie(fracs, explode=explode, labels=labels, autopct='%1.1f%%', shadow=True)
title('Raining Hogs and Dogs', bbox={'facecolor': '0.8', 'pad': 5})

show()  # Actually, don't show, just save to foo.png

我不想在GUI上顯示繪圖,而是想將繪圖保存到一個文件(比如說foo.png),例如,它可以在批處理腳本中使用。 我怎麼做?




在使用plot()和其他函數來創建你想要的內容之後,你可以使用這樣一個子句來選擇繪製到屏幕還是文件:

import matplotlib.pyplot as plt

fig = plt.figure(figuresize=4, 5)
# use plot(), etc. to create your plot.

# Pick one of the following lines to uncomment
# save_file = None
# save_file = os.path.join(your_directory, your_file_name)  

if save_file:
    plt.savefig(save_file)
    plt.close(fig)
else:
    plt.show()



如果像我一樣使用Spyder IDE,則必須禁用交互模式:

plt.ioff()

(這個命令在科學啟動時自動啟動)

如果您想再次啟用它,請使用:

plt.ion()




你可以做:

plt.show(hold=False)
plt.savefig('name.pdf')

並記得在關閉GUI圖表之前讓savefig完成。 這樣你可以事先看到圖像。

或者,您可以使用plt.show()查看它。然後關閉GUI並再次運行腳本,但是這次用plt.show()替換plt.savefig()

或者,您可以使用

fig, ax = plt.figure(nrows=1, ncols=1)
plt.plot(...)
plt.show()
fig.savefig('out.pdf')



剛剛在MatPlotLib文檔中發現了這個鏈接來解決這個問題: http://matplotlib.org/faq/howto_faq.html#generate-images-without-having-a-window-appear ://matplotlib.org/faq/howto_faq.html#generate-images-without-having-a-window-appear

他們說,防止數字出現的最簡單方法是通過matplotib.use(<backend>)使用非交互式後端(例如Agg matplotib.use(<backend>) ,例如:

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
plt.plot([1,2,3])
plt.savefig('myfig')

我個人更喜歡使用plt.close( fig ) ,因為你可以選擇隱藏某些數字(在一個循環中),但仍然會顯示循環後數據處理的數字。 它可能比選擇非交互式後端要慢 - 如果有人測試過,會很有趣。




其他答案是正確的。 但是,我有時會發現我想稍後打開圖形對象 。 例如,我可能想要更改標籤大小,添加網格或執行其他處理。 在一個完美的世界中,我只會重新運行生成劇情的代碼,並調整設置。 唉,這個世界並不完美。 因此,除了保存為PDF或PNG外,我還補充:

with open('some_file.pkl', "wb") as fp:
    pickle.dump(fig, fp, protocol=4)

像這樣,我可以稍後加載圖形對象並根據需要操作設置。

我還用堆棧中的每個函數/方法的source-code和locals()字典為堆棧寫出堆棧,以便我可以稍後確切地說明生成該圖的內容。

注意:小心,因為有時這種方法會產生大量文件。




Related