我有一个坐标列表和它们各自的误差值的形状:
# Graph from standard correlation, page 1
1.197 0.1838 -0.03504 0.07802 +-0.006464 +0.004201
1.290 0.2072 -0.04241 0.05380 +-0.005833 +0.008101
其中列表示x,y,lefterror,righterror,buttomerror,toperror
我将文件加载为error=np.genfromtxt("standard correlation.1",skip_header=1)
最后我尝试将其绘制为
xerr=error[:,2:4]
yerr=error[:,4:]
x=error[:,0]
y=error[:,1]
plt.errorbar(x,y,xerr=xerr,yerr=yerr,fmt='')
当我尝试运行它时,它会大喊一个ValueError: setting an array element with a sequence.
,我理解这个错误是在你将一个对象这样的列表传递给一个期望一个numpy数组对象的参数时给出的,我对如何解决这个问题无能为力,作为np。genfromtext应该总是返回一个数组。
谢谢你的帮助。
Edit:我更改了文件以删除'+'字符,因为读取'+-'会在底部错误列中产生NaN值,但我仍然得到相同的错误。
由于hpaulj,我注意到错误条的形状是(30,2),然而plt.errobar()
期望错误数组的形状是(2,n),因为python通常在类似的操作中变换矩阵并自动避免这个问题,我认为它也会这样做,但我决定以以下方式改变行:
xerr=error[:,2:4]
yerr=error[:,4:]
到
xerr=np.transpose(error[:,2:4])
yerr=np.transpose(error[:,4:])
使脚本正常运行,虽然我仍然不明白为什么以前的代码给了我这样的错误,如果有人能帮助我清理,我将不胜感激。
numpy期望的单个错误栏的数组形状是(2, N)
。因此,您需要对数组error[:,2:4].T
进行转置此外,matplotlib.errorbar
也理解这些相对于数据的值。如果x
为实际值,(xmin, xmax)
为错误值,则错误栏由x-xmin
变为x+xmax
。因此,在errorbar数组中不应该有负值。
import numpy as np
import matplotlib.pyplot as plt
f = "1 0.1 0.05 0.1 0.005 0.01" +
" 1.197 0.1838 -0.03504 0.07802 -0.006464 0.004201 " +
" 1.290 0.2072 -0.04241 0.05380 -0.005833 0.008101"
error=np.fromstring(f, sep=" ").reshape(3,6)
print error
#[[ 1. 0.1 0.05 0.1 0.005 0.01 ]
# [ 1.197 0.1838 -0.03504 0.07802 -0.006464 0.004201]
# [ 1.29 0.2072 -0.04241 0.0538 -0.005833 0.008101]]
xerr=np.abs(error[:,2:4].T)
yerr=np.abs(error[:,4:].T)
x=error[:,0]
y=error[:,1]
plt.errorbar(x,y,xerr=xerr,yerr=yerr,fmt='')
plt.show()
关于值错误,可能是+-
问题引起的