为什么对数刻度matplotlib条形图中的误差线是不平衡的?

cclgggtu  于 2023-01-13  发布在  其他
关注(0)|答案(2)|浏览(157)

我试图绘制一些条形图,其中每个y值都是某个系列的平均值,因此,我也试图为每个条形图添加误差条(标准差)。
幅度通常看起来是正确的,即使在对数标度下也是如此,但对于其中几个条,误差条几乎无限下降(-方向),而+方向误差是正确的幅度。我不认为这只是对数标度,但任何输入都非常感谢。以下是该图的链接

我已经检查过了,+方向的误差条是正确的,只是不知道为什么/怎么会偶尔下降到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'只是列表的字典。老实说,这看起来像是一个渲染问题,但我很好奇你们中是否有人遇到过这个问题。

vom3gejh

vom3gejh1#

就像在评论中提到的,这是因为你的stdy大(例如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()

输出:

6ojccjat

6ojccjat2#

您应该查看相对误差,而不是试图绘制标准差或任何其他变异性度量。
下面用一个例子来说明这一点:
在你的线性空间中,你将有x +/- delta_x要显示。
投影到对数空间中,它变为:log(x)+/- log(delta_x)。但是记住log(x)- log(y)= log(x/y)。因此,例如,你的非对称误差线。如果你了解更多关于相对误差的知识,你会发现一个合适的对称误差线。
享受你的学习:)

相关问题