2012-02-28 70 views
14

我試圖用matplotlib填充曲線下的區域。下面的腳本正常工作。在matlibplot python中的曲線下填充對數尺度的區域

import matplotlib.pyplot as plt 
from math import sqrt 
x = range(100) 
y = [sqrt(i) for i in x] 
plt.plot(x,y,color='k',lw=2) 
plt.fill_between(x,y,0,color='0.8') 
plt.show() 

但是,如果我設置y尺度爲對數(見下文)。它有時會填滿曲線上方的區域!誰能幫我?我想填充曲線和y = 0之間的區域。

x = range(100) 
y = [sqrt(i) for i in x] 
plt.plot(x,y,color='k',lw=2) 
plt.fill_between(x,y,0,color='0.8') 
plt.yscale('log') 
plt.show() 

在此先感謝!

回答

13

用對數y值表示,fill_between(x, y, 0)告訴matplotlib填充log(0) = -infinitylog(y)之間的區域。自然,它很尷尬。您可以通過將0更改爲1e-6等一些小號碼來避免此問題。

+0

當然! 1e-6可能太小,但plt.fill_between(x,y,1,color ='0.8')工作正常! – 2012-02-28 22:18:45

2

如上所述,在對數標度下的0 -> -inf。因此,小於或等於零的任何繪圖值都會有問題(需要日誌空間中的無限ylim)。這個問題的存在與你是否使用fill_between()無關。

幸運的是,matplotlib提供了一種很好的處理方法。在默認行爲中,matplotlib掩蓋每個小於或等於零的值的值。在您的示例中,這意味着您的整個y=0行被屏蔽並從定義填充區域的多邊形中排除。結果是通過從(100,10)向下和向左劃線(0,0)簡單地關閉多邊形。另一個選項是剪輯值。在這種情況下,它們設置爲1e-300,在確定圖的ylim時不會查閱。因此,要得到您想要的結果,請執行以下操作:

plt.yscale('log', nonposy='clip') 
相關問題