python-绘制错误条时出现奇怪错误

python-绘制错误条时出现奇怪错误,python,matplotlib,errorbar,Python,Matplotlib,Errorbar,我试图在一个绘图中合并3个数据集。每个数据集都有自己的y和x错误。我收到此错误消息: Traceback (most recent call last): File "SED_plot.py", line 310, in <module> plt.errorbar(x0, y0, xerr=x0err, linestyle='None', ecolor="black", label= "Channel Width") File "/Library/Python/2.7

我试图在一个绘图中合并3个数据集。每个数据集都有自己的y和x错误。我收到此错误消息:

Traceback (most recent call last):
  File "SED_plot.py", line 310, in <module>
    plt.errorbar(x0, y0, xerr=x0err, linestyle='None', ecolor="black", label= "Channel Width")
  File "/Library/Python/2.7/site-packages/matplotlib-override/matplotlib/pyplot.py", line 2766, in errorbar
    errorevery=errorevery, capthick=capthick, **kwargs)
  File "/Library/Python/2.7/site-packages/matplotlib-override/matplotlib/axes/_axes.py", line 2749, in errorbar
    in cbook.safezip(x, xerr[0])]
  File "/Library/Python/2.7/site-packages/matplotlib-override/matplotlib/cbook.py", line 1479, in safezip
    raise ValueError(_safezip_msg % (Nx, i + 1, len(arg)))
ValueError: In safezip, len(args[0])=16 but len(args[1])=48
可能是列表切片在这种情况下不起作用吗?所有的x值和y值都在一个列表中(分别为x_val_All和y_val_All),相应的错误也在一个列表中

要复制的示例代码:

import matplotlib.pyplot as plt

y = range(0,21,1)
x = range(0,21,1)
y_err = [0.5]*21

x_low = [0.7]*21
x_upper = [1.4]*21
x_err = [x_low, x_upper]


plt.errorbar(x[0:7],y[0:7], xerr=x_err[0:7], yerr=y_err[0:7], linestyle="none", color="black")
plt.errorbar(x[8:15],y[8:15], xerr=x_err[8:15], yerr=y_err[8:15], linestyle="none", color="red")

plt.show()

索引
x_err
是错误的根本原因,因为这是两个元素的列表。我个人倾向于使用列表来解决这个问题:

import matplotlib.pyplot as plt

y = range(0,21,1)
x = range(0,21,1)
y_err = [0.5]*21

x_low = [0.7]*21
x_upper = [1.4]*21
x_err = [x_low, x_upper]

plt.errorbar(x[0:7], y[0:7], xerr=[_x[0:7] for _x in x_err], yerr=y_err[0:7], linestyle="none", color="black")
plt.errorbar(x[8:15], y[8:15], xerr=[_x[8:15] for _x in x_err], yerr=y_err[8:15], linestyle="none", color="red")

plt.show()
(注意在列表理解中使用了
\ux
——列表理解泄漏到Python 2.7中的局部范围,如果我们在理解中使用
x
作为变量,这将覆盖早期的
x
变量。)

你也可以这样做:

plt.errorbar(x[0:7], y[0:7], xerr=[x_err[0][0:7], x_err[1][0:7]], yerr=y_err[0:7], linestyle="none", color="black")
plt.errorbar(x[8:15], y[8:15], xerr=[x_err[0][8:15], x_err[1][8:15]], yerr=y_err[8:15], linestyle="none", color="red")
虽然这有点冗长。

请查看错误显示x_错误的列表,列表需要为2x7,但是切片的方式不会产生该结果。您正在切片范围为7的len 2列表。下面的代码为您提供了所需的绘图

import matplotlib.pyplot as plt
y = range(0,21,1)
x = range(0,21,1)
y_err = [0.5]*21

x_low = [0.7]*21
x_upper = [1.4]*21
x_err = [x_low, x_upper]

fig, ax = plt.subplots()
idx = range(0, 16, 7)
for start, stop in zip(idx[:-1], idx[1:]):
    ax.errorbar(x[start:stop], y[start:stop], y_err[start:stop], \
                [ i[start:stop] for i in x_err])


编辑:对于这样的错误,我建议使用numpy,因为它的数组比列表更容易检查维度和索引。

你能发布完整的堆栈跟踪吗?这有助于缩小错误发生的范围。@AndrewGuy,确实刚刚编辑了上面的问题。使用一些虚拟数据对我来说效果很好。不过我正在运行Python3.6。你能发布一个完全可复制的示例吗?i、 e.包括一些虚拟数据等,这样某人就可以复制和粘贴来试用。我想知道你是否在某个地方有输入错误。x_err有两个元素,所以你不能用7、8或15这样的数字来索引它。我明白了!这是处理各种非对称错误的唯一方法,还是有比构造这样的东西更好的方法:
x_err=[x_low,x_upr]
这似乎不是一种不合理的方法。我会在尝试为这些不对称错误下标时使用列表理解。您的第一个建议(我的个人偏好…等)没有正确绘制数据,但之后的第二个建议正确绘制了数据。好吧,这有点奇怪-所有3个示例在我的环境中都工作相同。这可能是一个Python版本的问题。一般的评论:考虑使用NUMPY数组而不是列表列表。
import matplotlib.pyplot as plt
y = range(0,21,1)
x = range(0,21,1)
y_err = [0.5]*21

x_low = [0.7]*21
x_upper = [1.4]*21
x_err = [x_low, x_upper]

fig, ax = plt.subplots()
idx = range(0, 16, 7)
for start, stop in zip(idx[:-1], idx[1:]):
    ax.errorbar(x[start:stop], y[start:stop], y_err[start:stop], \
                [ i[start:stop] for i in x_err])