[英]Fill area under curve in matlibplot python on log scale
我正試圖用matplotlib填充曲線下的區域。 下面的腳本運行正常。
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()
提前致謝!
使用對數y標度, fill_between(x, y, 0)
告訴matplotlib填充log(0) = -infinity
和log(y)
之間的區域。 當然,它很好玩。 您可以通過將0
更改為1e-6
類的小數字來避免此問題。
如上所述, 0 -> -inf
以對數標度表示。 因此,任何小於或等於零的繪制值都是有問題的(在對數空間中需要無限的ylim)。 此問題的存在與您是否使用fill_between()無關。
幸運的是,matplotlib提供了一種很好地處理它的方法。 在默認行為中,matplotlib會屏蔽小於或等於零的每個值的值。 在您的示例中,這意味着整個y=0
線被遮罩並從定義填充區域的多邊形中排除。 結果是通過從(100,10)
向下和向左繪制一條線到(0,0)
簡單地關閉多邊形。 另一種選擇是剪切值。 在這種情況下,它們被設置為1e-300
並且在確定繪圖的ylim時不參考。 因此,要獲得所需結果,請執行以下操作:
plt.yscale('log', nonposy='clip')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.