繁体   English   中英

Python Matplotlib:不对称误差线 ValueError

[英]Python Matplotlib: Asymmetric Error Bars ValueError

我正在尝试为许多来源绘制列密度“nh”图。 每个来源由一个键值表示。 而且我有多个字典将该键与某个值匹配。 例如:

print(nh_noUL_val, '\n')
print(noUL_colors, '\n')
print(asymetric_error,'\n')

这给了我的数据:

{2: 3.3e+21, 7: 7e+20, 29: 2e+22, 203: 8.5e+21, 226: 2.1e+21, 231: 6e+19, 259: 4.2e+21, 307: 1.8e+20, 320: 2.6e+21, 366: 4.4e+22, 374: 6e+21, 1143: 3e+22} 

{2: 'black', 7: 'green', 29: 'red', 203: 'blue', 226: 'blue', 231: 'blue', 259: 'blue', 307: 'green', 320: 'green', 366: 'blue', 374: 'red', 1143: 'red'} 

{2: [4e+20, 4e+20], 7: [7e+20, 3.6e+21], 29: [2e+22, 3.3e+22], 203: [8.5e+21, 2.47e+22], 226: [2.1e+21, 2.17e+22], 231: [6e+19, 9.76e+21], 259: [4.2e+21, 1.9899999999999997e+22], 307: [1.8e+20, 4.65e+21], 320: [2.6e+21, 1.2900000000000001e+22], 366: [4.4e+22, 1.4800000000000001e+23], 374: [6e+21, 3.1e+22], 1143: [3e+22, 4e+22]} 

使用这些数据,我尝试将每个源绘制为带有各自颜色、值和不对称误差的彩色数据点。

fig, ax = plt.subplots()

for x, y, yerr, color in zip(nh_noUL_val.keys(), nh_noUL_val.values(), asymetric_error.values(),
                             noUL_colors.values()):

    ax.errorbar(x,y , yerr = asymetric_error,  color = color, marker = 'o', ms = 5)
plt.show()

但是,这给了我:

ValueError: err must be [ scalar | N, Nx1 or 2xN array-like ]

诚然,我对 python 有点陌生,并不完全理解数组。 但我的猜测是我的asymmetric_error.values()实际上是一个 Nx2 数组? 如果是这种情况,我如何将其变成 2xN 形式? 如果不是这样,我的代码有什么问题?

您正在为yerr参数传递字典。 它需要一个scalar or array-like, shape(N,) or shape(2,N),

 ax.errorbar(x,y , yerr = asymetric_error,...

你想要不对称的条形,所以yerr需要是 shape(2,N) 这意味着两个项目,每个项目都有 N 个值。 由于您在迭代时一次绘制一个点,因此 N=1。 yerr需要是[[neg_error][pos_error]]

您的 for 语句需要像这样分别捕获这两个错误。

for x, y, (neg_err,pos_err), color in zip(nh_noUL_val.keys(), nh_noUL_val.values(),
                                          asymetric_error.values(), noUL_colors.values()):
    #print(x, y, yerr, color)
    ax.errorbar(x,y , yerr=[[neg_err],[pos_err]],  color=color,marker='o', ms=5)

一个警告。 您的循环依赖于三个字典的顺序相同。 如果您使用的是 Python 3.7+,如果它们以相同的顺序构造,那也不是问题。 如果您使用的是 3.5-,则需要确保每个字典中的值都用于相同的键。 像这样的东西:

for x,y in nh_noUL_val.items():
    color = noUL_colors[x]
    neg, pos = asymetric_error[x]
    ax.errorbar(x,y,yerr=[[neg],[pos]],color=colors,marker='o', ms=5)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM