使用errorbar绘制单个点的非对称误差线

时间:2015-08-04 14:46:52

标签: python matplotlib

目标:使用错误栏为单个点绘制非对称x误差线。我想显示数据集的四分位数范围(IQR)。

代码:

import numpy as np
import matplotlib.pyplot as plt

y = 1.0
data = np.random.rand(100)

median = np.median(data)
upper_quartile = np.percentile(data, 75)
lower_quartile = np.percentile(data, 25)
IQR = upper_quartile - lower_quartile

plt.errorbar(median, y, xerr=[lower_quartile ,upper_quartile], fmt='k--')

plt.savefig('IQR.eps')
plt.show()

错误:

Traceback (most recent call last):
  File "IQR.py", line 15, in <module>
    plt.errorbar(median, y, xerr=[0.5,0.75], fmt='k--')
  File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 2251, in errorbar
    ret = ax.errorbar(x, y, yerr, xerr, fmt, ecolor, elinewidth, capsize, barsabove, lolims, uplims, xlolims, xuplims, **kwargs)
  File "/usr/lib/pymodules/python2.7/matplotlib/axes.py", line 5327, in errorbar
    in cbook.safezip(x,xerr)]
  File "/usr/lib/pymodules/python2.7/matplotlib/cbook.py", line 1294, in safezip
    raise ValueError(_safezip_msg % (Nx, i+1, len(arg)))
ValueError: In safezip, len(args[0])=1 but len(args[1])=2

我的问题是我无法为单个点创建非对称误差线,其中该点表示平均值,误差线的上限和下限将是上下四分位数。

3 个答案:

答案 0 :(得分:8)

我通常会使用vlineshlines(我认为上限只是让人分心):

 plt.hlines( y, median-lower_quartile, median+upper_quartile)
 plt.plot(median, y, 'o')

Simple plot

如果您仍想使用errorbar,可以尝试

plt.errorbar(median, y, xerr=np.array([[lower_quartile ,upper_quartile]]).T, 
        fmt='ko')

with errorbar

请注意,我真的不知道你如何在这里定义四分位数,所以你可能需要确保你得到正确的数字!!!

答案 1 :(得分:0)

确保xerr获取列表列表。如果它只是一个列表,它将假设它包含两个Y的对称误差条。但是只有一个Y,这就是你得到错误的原因。

您的错误栏也是错误的。将错误栏调用更改为

plt.errorbar(median, y, xerr=[[median-lower_quartile ,upper_quartile-median]], fmt='k--')

答案 2 :(得分:-1)

您传递给safezip的两个论点有不同的大小。您发布的堆栈跟踪就在这里说:

ValueError: In safezip, len(args[0])=1 but len(args[1])=2

这说的是论证的长度是1,但是参数2的长度是2,所以zip实际上并不能合并这两个列表。