在matplotlib中使用yscale('log')时缺少错误栏

时间:2012-11-21 11:02:05

标签: python matplotlib

在某些情况下,当使用对数刻度时,matplotlib会显示错误栏的绘图错误。 假设这些数据(例如在pylab中):

s=[19.0, 20.0, 21.0, 22.0, 24.0]
v=[36.5, 66.814250000000001, 130.17750000000001, 498.57466666666664, 19.41]
verr=[0.28999999999999998, 80.075044597909169, 71.322124839818571, 650.11015891565125, 0.02]
errorbar(s,v,yerr=verr)

我得到一个正常的结果但是当我切换到对数刻度时:

yscale('log')

我得到的图表中看不到某些错误栏,但您仍然可以看到一些错误栏上限。 (见下文。)为什么会发生这种情况,我该如何解决?

log plot example

2 个答案:

答案 0 :(得分:20)

切换到对数刻度,但使用此命令:

plt.yscale('log', nonposy='clip')

类似地,对于x轴:

plt.xscale('log', nonposx='clip')

无论如何,如果你在过去的半年中得到dev version of matplotlib,那么默认情况下你会有这种剪辑行为,如Make nonposy='clip' default for log scale y-axes中所述。

答案 1 :(得分:12)

问题是,对于某些点v-verr变为负值,值&lt; = 0无法显示在对数轴上(log(x)x<=0未定义)为了解决这个问题您可以使用非对称错误并强制结果值对于违规点大于零。

在错误大于值verr>=v的任何时候,我们指定verr=.999v,在这种情况下,错误栏将接近于零。

这是脚本

import matplotlib.pyplot as plt
import numpy as np

s=[19.0, 20.0, 21.0, 22.0, 24.0]
v=np.array([36.5, 66.814250000000001, 130.17750000000001, 498.57466666666664, 19.41])
verr=np.array([0.28999999999999998, 80.075044597909169, 71.322124839818571,     650.11015891565125, 0.02])
verr2 = np.array(verr)
verr2[verr>=v] = v[verr>=v]*.999999
plt.errorbar(s,v,yerr=[verr2,verr])
plt.ylim(1E1,1E4)
plt.yscale('log')
plt.show()

结果如下

Logarithmic plot with error bars