Python: Trying to plot error bars on a graph gives "ValueError: err must be [ scalar | N, Nx1 or 2xN array-like ]"
Python: Trying to plot error bars on a graph gives "ValueError: err must be [ scalar | N, Nx1 or 2xN array-like ]"
当我尝试在图表上绘制误差线时遇到以下问题。
import numpy as np
import sys
import matplotlib.pyplot as plt
col1 = []
col2 = []
col3 = []
while True:
try:
N = input('Please enter the full name of your numbers text file with
its file format (e.g "Numbers.txt"): ')
with open(N, 'r') as f:
for line in f:
first, second, third = line.split()
col1.append(first)
col2.append(second)
col3.append(third)
except IOError:
sys.exit('Error: Data file is invalid! Please ensure your file
exists. ')
except ValueError:
sys.exit('Error: Data file is invalid! Please ensure your file
contains just numbers, as well as enough of them with none missing. ')
else:
break
x = np.array(col1)
y = np.array(col2)
e = np.array(col3)
N = 1
p = 0
while N <= len(col1):
p = p + 1/(float(col3[N-1]))**2
N = N+1
N = 1
q = 0
while N <= len(col1):
q = q + float(col1[N-1])/(float(col3[N-1]))**2
N = N+1
N = 1
r = 0
while N <= len(col1):
r = r + float(col2[N-1])/(float(col3[N-1]))**2
N = N+1
N = 1
s = 0
while N <= len(col1):
s = s + (float(col1[N-1]))**2/(float(col3[N-1]))**2
N=N+1
N = 1
t = 0
while N <= len(col1):
t = t + (float(col1[N-1])*float(col2[N-1]))/(float(col3[N-1]))**2
N = N+1
delta = (p*s)-(q**2)
a = ((r*s)-(q*t))/delta
b = ((p*t)-(q*r))/delta
print('a is equal to: ' + str(a))
print('b is equal to: ' + str(b))
sigma_a = float(s/delta)**0.5
sigma_b = float(p/delta)**0.5
print('Error in a (Sigma_a) is equal to: ' + str(sigma_a))
print('Error in b (Sigma_b) is equal to: ' + str(sigma_b))
best_y = []
best_x = col1
N = 0
while N <= len(col1)-1:
Y = a + ((b)*(float(col1[N])))
best_y.append(Y)
N = N + 1
Y = 0
plt.plot(x, y, 'ro', best_x, best_y)
plt.errorbar(x, y, yerr=e, fmt='-o')
plt.title('Graph to show relationship between given values of x and y')
plt.xlabel('x')
plt.ylabel('y')
plt.grid(True)
plt.show()
python 给出的输出是这样的:
"ValueError: err must be [ scalar | N, Nx1 or 2xN array-like ]"
好像是什么问题?
顺便说一句,用于提供数字的文件是一个 txt 文件,是这样的:
-2 2.1 -0.365635756
0 2.4 0.347433737
2 2.5 0.263774619
4 3.5 -0.244930974
6 4.2 -0.004564913
对于此 post 中的大量代码表示歉意,但我觉得我应该包括任何可能隐藏问题的内容(对于 python 来说仍然很新)。
非常感谢,
卢克。
您没有将文件中的字符串值转换为浮点数。这就是 matplotlib
抛出错误的原因。当您通过 np.array()
将 col1
、col2
和 col3
转换为数组时,它不会将字符串值转换为浮点数,它只是创建字符串数组(您可以看到这通过检查 x
、y
或 e
像:
In[1]: x
Out[1]:
array(['-2', '0', '2', '4', '6'],
dtype='<U2')
dtype='<U2'
表示元素是unicode字符串
修复代码的最快方法是在读取值时将值显式转换为浮点数,并将它们附加到列列表中,如下所示:
while True:
try:
N = input('Please enter the full name of your numbers text file with
its file format (e.g "Numbers.txt"): ')
with open(N, 'r') as f:
for line in f:
first, second, third = line.split()
col1.append(float(first))
col2.append(float(second))
col3.append(float(third))
更好的解决方法是使用 Python 标准库 csv
module 来处理数据文件的读取和解析。
当我尝试在图表上绘制误差线时遇到以下问题。
import numpy as np
import sys
import matplotlib.pyplot as plt
col1 = []
col2 = []
col3 = []
while True:
try:
N = input('Please enter the full name of your numbers text file with
its file format (e.g "Numbers.txt"): ')
with open(N, 'r') as f:
for line in f:
first, second, third = line.split()
col1.append(first)
col2.append(second)
col3.append(third)
except IOError:
sys.exit('Error: Data file is invalid! Please ensure your file
exists. ')
except ValueError:
sys.exit('Error: Data file is invalid! Please ensure your file
contains just numbers, as well as enough of them with none missing. ')
else:
break
x = np.array(col1)
y = np.array(col2)
e = np.array(col3)
N = 1
p = 0
while N <= len(col1):
p = p + 1/(float(col3[N-1]))**2
N = N+1
N = 1
q = 0
while N <= len(col1):
q = q + float(col1[N-1])/(float(col3[N-1]))**2
N = N+1
N = 1
r = 0
while N <= len(col1):
r = r + float(col2[N-1])/(float(col3[N-1]))**2
N = N+1
N = 1
s = 0
while N <= len(col1):
s = s + (float(col1[N-1]))**2/(float(col3[N-1]))**2
N=N+1
N = 1
t = 0
while N <= len(col1):
t = t + (float(col1[N-1])*float(col2[N-1]))/(float(col3[N-1]))**2
N = N+1
delta = (p*s)-(q**2)
a = ((r*s)-(q*t))/delta
b = ((p*t)-(q*r))/delta
print('a is equal to: ' + str(a))
print('b is equal to: ' + str(b))
sigma_a = float(s/delta)**0.5
sigma_b = float(p/delta)**0.5
print('Error in a (Sigma_a) is equal to: ' + str(sigma_a))
print('Error in b (Sigma_b) is equal to: ' + str(sigma_b))
best_y = []
best_x = col1
N = 0
while N <= len(col1)-1:
Y = a + ((b)*(float(col1[N])))
best_y.append(Y)
N = N + 1
Y = 0
plt.plot(x, y, 'ro', best_x, best_y)
plt.errorbar(x, y, yerr=e, fmt='-o')
plt.title('Graph to show relationship between given values of x and y')
plt.xlabel('x')
plt.ylabel('y')
plt.grid(True)
plt.show()
python 给出的输出是这样的:
"ValueError: err must be [ scalar | N, Nx1 or 2xN array-like ]"
好像是什么问题?
顺便说一句,用于提供数字的文件是一个 txt 文件,是这样的:
-2 2.1 -0.365635756
0 2.4 0.347433737
2 2.5 0.263774619
4 3.5 -0.244930974
6 4.2 -0.004564913
对于此 post 中的大量代码表示歉意,但我觉得我应该包括任何可能隐藏问题的内容(对于 python 来说仍然很新)。
非常感谢,
卢克。
您没有将文件中的字符串值转换为浮点数。这就是 matplotlib
抛出错误的原因。当您通过 np.array()
将 col1
、col2
和 col3
转换为数组时,它不会将字符串值转换为浮点数,它只是创建字符串数组(您可以看到这通过检查 x
、y
或 e
像:
In[1]: x
Out[1]:
array(['-2', '0', '2', '4', '6'],
dtype='<U2')
dtype='<U2'
表示元素是unicode字符串
修复代码的最快方法是在读取值时将值显式转换为浮点数,并将它们附加到列列表中,如下所示:
while True:
try:
N = input('Please enter the full name of your numbers text file with
its file format (e.g "Numbers.txt"): ')
with open(N, 'r') as f:
for line in f:
first, second, third = line.split()
col1.append(float(first))
col2.append(float(second))
col3.append(float(third))
更好的解决方法是使用 Python 标准库 csv
module 来处理数据文件的读取和解析。