我正在尝试在一个图中组合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
当我运行这段代码时:
x0, y0 = x_val_all[0:16], y_val_all[0:16]
x0err, y0err = x_error_all[0:16], y_error_all[0:16]
x1, y1 = x_val_all[17:33], y_val_all[17:33]
x1err, y1err = x_error_all[17:33], y_error_all[17:33]
x2, y2 = x_val_all[33:49], y_val_all[33:49]
x2err, y2err = x_error_all[33:49], y_error_all[33:49]
plt.errorbar(x0, y0, xerr=x0err, linestyle='None', ecolor="black", label= "Channel Width")
plt.errorbar(x0, y0, yerr=y0err, linestyle='None', ecolor="black", label= "Standard Deviation")
plt.errorbar(x1, y1, xerr=x1err, yerr=y1err, ecolor="red")
plt.errorbar(x2, y2, xerr=x2err, yerr=y2err, ecolor="purple")
plt.show()
在这种情况下,列表切片是否不起作用?所有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()
答案 0 :(得分:1)
索引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()
(请注意,列表理解中使用_x
-列表理解泄漏到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")
尽管有点冗长。
答案 1 :(得分:1)
看一下docs,您将x_error表示为错误,列表必须为2x7,但是切片的方式不会产生该结果。您正在切片范围为7的len 2列表。下面的代码为您提供了所需的绘图
Exception Type: ValueError
Exception Value: too many values to unpack (expected 2)
编辑:对于此类错误,我建议使用numpy作为其数组,它使您可以比列表列表更轻松地检查维数并对其进行索引。