12

在某些情况下,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')

我得到一个图,其中一些误差条不可见,尽管您仍然可以看到一些误差条上限。(见下文。)为什么会发生这种情况,我该如何解决?

对数图示例

4

2 回答 2

23

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

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

类似地,对于 x 轴:

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

无论如何,如果您在过去半年获得了matplotlib 的开发版本,则默认情况下您将具有这种剪裁行为,如Make nonposy='clip' default for log scale y-axes中所述。

于 2014-03-24T04:19:09.510 回答
12

问题是,对于某些点v-verr正在变为负数,值 <=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()

这是结果

带误差线的对数图

于 2012-11-21T12:08:17.493 回答