Python:尝试在图形上绘制误差条给出“ValueError:err必须是[标量| N,Nx1或2xN数组]”

时间:2017-04-28 01:13:14

标签: python numpy matplotlib graph errorbar

当我尝试在图表上绘制错误条时,我遇到了以下问题。

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

为这篇文章中的大量代码道歉,但我觉得我应该包含任何可能隐藏问题的东西(对python来说还是很新的)。

非常感谢,

路。

1 个答案:

答案 0 :(得分:0)

您没有将文件中的字符串值转换为浮点数。这就是matplotlib抛出错误的原因。当您通过col1col2col3np.array()转换为数组时,它不会将字符串值转换为浮点值,它只会创建字符串数组(您可以看到这可以通过检查xye来完成:

In[1]: x
Out[1]: 
array(['-2', '0', '2', '4', '6'], 
      dtype='<U2')

dtype='<U2'表示元素是unicode字符串。

修复代码的最快方法是在读取值时将值显式转换为float,将它们附加到列列表中,如下所示:

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来处理数据文件的读取和解析。