2014-02-28 32 views
3

我有兩個類似的matplotlib代碼片段產生不同的結果。matplotlib NaN's和pylab NaN的

1:

import matplotlib.pyplot as plt 
import numpy as np 

x = np.linspace(0,10,100) 
y = np.linspace(0,10,100) 
y[10:40] = np.nan 
plt.plot(x,y) 
plt.savefig('fig') 

2:

from pylab import * 

x = linspace(0,10,100) 
y = linspace(0,10,100) 
y[10:40] = np.nan 
plot(x,y) 
savefig('fig') 

代碼#1產生與具有不同顏色

代碼#2的實線填充在NaN的區域中的直線用直線產生一個圖形,但不會用一條線填充NaN區域。相反,那裏存在差距。

如何讓代碼#1產生代替NaN的代碼#2的差距。我一直在Google上搜索幾天,並且什麼都沒有提出。任何幫助或建議,將不勝感激。在此先感謝

+1

這兩個是相同的。如果您將同一條線繪製兩次,並且第一個沒有「NaN」,則您得到「NaN區域的直線用不同顏色的實線填充的直線」是唯一的方法。你是在一起運行這兩段代碼嗎?如果是這樣,他們將在同一個數字上繪圖。 –

+0

我使用內聯後端得到相同的數字。你使用了哪個後端? –

+3

你幾乎可以肯定地看到你在相同的'ipython'(或類似的)會話中繪製的效果。如果您在長時間運行的交互式會話中工作,始終明確地創建一個新數字是一個好主意。 –

回答

3

只是爲了解釋什麼是可能發生的事情:

的兩段代碼,你表現是相同的。如果他們自己調用它們,它們將始終產生相同的輸出。 pylab基本上是公正的代碼,做了幾行字:(還有比這更給它一點,但它的基本思想。)

from numpy import * 
from matplotlib.mlab import * 
from matplotlib.pyplot import * 

但絕對沒有辦法pylab.plot引用不同的功能比plt.plot


但是,如果你只需要調用plt.plot(或pylab.plot,它們是相同的功能),它繪製在當前身影。

如果您之前在該圖上繪製了某些東西,它仍然會在那裏。 (如果你熟悉MATLAB,matplotlib默認爲hold('on')您可以plt.hold改變這一點,但最好是在Python更加明確,只需要創建一個新的數字)

基本上,你可能這樣做:

import matplotlib.pyplot as plt 
import numpy as np 

x = np.linspace(0,10,100) 
y = np.linspace(0,10,100) 

plt.plot(x,y) 
plt.savefig('fig') 

,然後在同一個互動ipython會話,你這樣做:

y[10:40] = np.nan 
plt.plot(x, y) 
plt.savefig('fig') 

因爲你沒有打電話show,目前的數字仍然是相同的一個,因爲它是b安伏。 「滿」線仍然存在於第二個下面,而第二個與NaN的線是不同的顏色,因爲您已經繪製在相同的軸上。

這是爲什麼使用面向對象的接口是個好主意的原因之一。這樣你就知道正好是你正在繪製的軸和圖。

例如:

fig, ax = plt.subplots() 
ax.plot(x, y) 
fig.savefig('test.png') 

如果你不打算這樣做,在非常至少,當你想要一個新的身影總是明確地創建一個新的人物和/或軸。 (例如。首先打電話plt.figure()

+0

感謝您的回覆。我在不同的Python shell中運行代碼片段,並在我的程序中使用面向對象的接口。 – user3365990

+0

是的你是對的。我正在重繪前一個。然而,在我的計劃中,我每次都在創造一個新的數字,然後進行繪圖。我知道這一點,因爲當我改變我的數據集時,前一行消失並被另一行替換,但NaN區域仍然填充了一行 – user3365990

+1

@ user3365990 - 數組的數據類型是什麼? 'NaN'是一個浮點值。如果將NaN分配給整數數組,它們將是一個大的負數,而不是NaN。 –