2014-02-19 27 views
26

以下示例代碼生成一個簡單的圖,然後將其保存爲'fig1.pdf',然後將其顯示,然後再次將其保存爲'fig2.pdf 」。第一張圖像看起來和預期一樣,但第二張圖像是空白的(包含一個白色正方形)。這裏究竟發生了什麼?行plt.show()顯然弄亂了東西,但我無法弄清楚什麼/如何!調用pyplot.show()後調用pyplot.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') 

回答

36

之前,如果你想保存顯示它後面的數字再次繪製它,你需要堅持圖形實例。調用show之後plt.savefig不起作用的原因是當前數字已被重置。

pyplot跟蹤哪些數字,軸等是「當前」(即尚未與show一起顯示)的幕後。 gcfgca分別獲取當前圖形和當前軸實例。 plt.savefig(和基本上任何其他pyplot方法)只是plt.gcf().savefig(...)。換句話說,獲取當前圖形實例並調用它的savefig方法。同樣plt.plot基本上是plt.gca().plot(...)

調用show後,「當前」圖形和座標軸列表爲空。

一般來說,最好直接使用figure和axes實例來繪製/保存/顯示/ etc,而不是使用plt.plot等來隱式地獲取當前的圖形/座標軸和座標圖。使用pyplot(尤其是交互式)使用pyplot沒有任何問題,但它可以讓你更容易地在腳下拍攝自己。

對於plt.show()使用pyplot並生成圖形和軸對象,但直接使用圖形或軸方法。 (例如,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') 
+0

編輯nm,找出這是非交互式 – tacaswell

+1

+1,Joe。這,國際海事組織,說明爲什麼pyplot接口的使用應保持在最低限度。 –

3

pyplot.show塊關閉並破壞情節。您可以使用

plt.show(block=False) 

之後,保存到fig2.pdf會工作,或者你可以節省

plt.plot(x,y) 
plt.savefig('fig2.pdf') 
+0

這不是什麼'塊'控制,它是值得的。 'block'控制gui工具包的主循環​​是否會阻止進一步的執行,或者在單獨的線程中運行。 –

1

我繪製第二個之前運行plt.cla()plt.clf()。分別清除當前軸和清除當前繪圖。

相關問題