簡體   English   中英

在loglibplot python中以對數刻度填充曲線下面積

[英]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) = -infinitylog(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM