簡體   English   中英

為什么對數刻度 matplotlib 條形 plot 中的誤差線是不平衡的?

[英]Why error bars in log-scale matplotlib bar plot are lopsided?

我正在嘗試 plot 一些條形圖,其中每個 y 值都是某些系列的平均值。 因此,我還嘗試為每個條添加誤差線(標准偏差)。

幅度通常看起來是正確的,即使是對數刻度,但是對於幾個條形,誤差條幾乎無限期地下降(- 方向),而 + 方向誤差是正確的幅度。 我不認為它只是對數縮放,但非常感謝任何輸入。 這是 plot 的鏈接

這是情節的鏈接

我已經檢查過,+ 方向誤差線是正確的,只是不確定它們為什么/如何偶爾下降到 x 軸。 下面是一個簡化的例子。

y = [99.79999999999997, 0.11701249999999999, 0.00011250000000000004, 0.013393750000000001,0.007743750000000001,
   0.01, 0.033906250000000006, 0.0009687500000000002, 0.04187500000000001, 0.0218, 0.0018062499999999997, 0.0005187500000000001]
std =[0.013662601021279521, 0.1500170651403811, 3.4156502553198664e-05, 0.001310709095617076,0.0006239324215543433,
   0.0, 0.0021671698133741164,0.0018750000000000001, 0.005302515126491074,0.007984401459512583,0.0006297817082132506,4.0311288741492725e-05]

plt.figure()  # Powder plot
plt.bar(np.arange(len(y)), y, yerr=std)
plt.yscale('log')

'key_list' 只是將成為 x-tick 標簽的字符串列表。 'width' 是成對的條形偏移量。 'cm' 和 'kk' 只是列表的字典。 老實說,這似乎是一個渲染問題,但如果你們中的任何人遇到過這個問題,我會非常好奇。

如注釋中所述,這是因為您的std大於y (例如std[1] > y[1] ,因此對log刻度變為香蕉。您可以通過對較低的std引入較小的公差來解決此問題:

tor = 1e-9
lower_std = [a - tor if a<b else b for a,b in zip(y,std)]

plt.figure()
plt.bar(np.arange(len(y)), y, yerr=(lower_std,std))
plt.yscale('log')
plt.show()

輸出:

在此處輸入圖片說明

您應該查看相對誤差,而不是嘗試 plot 標准偏差或任何其他可變性度量。

用一個例子來說明這一點:

在您的線性空間中,您將顯示 x +/- delta_x。

投影到你的對數空間中,它變成:log(x) +/- log(delta_x)。 但請記住 log(x) - log(y) = x/y。 因此,例如,您的非對稱誤差線。 如果您了解有關相對誤差的更多信息,您會發現一個合適的對稱誤差條。

享受你的學習:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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