Matplotlib不对称的yerr方式关闭

时间:2015-11-22 17:16:27

标签: python matplotlib errorbar

据我所知,matplotlib只是为我的错误栏绘制了不正确的值。我已经尽可能地简化了我的代码,直到硬编码的值,事情仍然是错误的...在下面的例子中,我通过scatter绘制了完全相同的值,它们出现了我希望他们在哪里 - 但错误栏距离数英里。我误解了什么吗?

最小例子:

from matplotlib.pyplot import *

x = [1, 2, 3, 4, 5]
y = [5, 11, 22, 44, 88]
err = [[4.3, 10.1, 19.8, 40, 81.6],
       [5.9, 13.6, 24.6, 48.5, 100.2]]

figure();
errorbar(x, y, yerr=err, label="data")
scatter(x, err[0], c='r', label="lower limit")
scatter(x, err[1], c='g', label="upper limit")

legend()
show()

结果:Result of the code sample above

2 个答案:

答案 0 :(得分:3)

误差线是相对于数据的,而且,+ / - 值都是正值(所以绝对误差):

from matplotlib.pyplot import *
import numpy as np

x = np.array([1, 2, 3, 4, 5])
y = np.array([5, 11, 22, 44, 88])
err = np.array([[4.3, 10.1, 19.8, 40,   81.6 ],
                [5.9, 13.6, 24.6, 48.5, 100.2]])

err2 = np.zeros_like(err)
err2[0,:] = y - err[0,:]
err2[1,:] = err[1,:] - y

figure();
errorbar(x, y, yerr=err2, label="data")
scatter(x, err[0], c='r', label="lower limit")
scatter(x, err[1], c='g', label="upper limit")

legend()
show()

enter image description here

答案 1 :(得分:2)

正如@Bart在评论中指出的那样,matplotlib将yerr解释为相对于线的y坐标的一组+/-偏移。来自the documentation

  

xerr/yerr :[标量| N,Nx1或2xN阵列式]

     

如果是标量数,len(N)类数组对象或类似Nx1数组的对象,则会在 +/-相对于数据的值处绘制错误栏。

     

如果形状为2xN的序列,则相对于数据 -row1和+ row2绘制错误栏。

您可以通过yerr之间的绝对差异来获得您正在寻找的效果:

err = np.array(err)
y = np.array(y)
offsets = np.abs(err - y[None, :])

figure();
errorbar(x, y, yerr=offsets, label="data")
scatter(x, err[0], c='r', label="lower limit")
scatter(x, err[1], c='g', label="upper limit")
legend()
show()

enter image description here