为啥我不能绘制不是标量、一维或 (2, n) 数组的东西?

Posted

技术标签:

【中文标题】为啥我不能绘制不是标量、一维或 (2, n) 数组的东西?【英文标题】:Why I can't plot something that isn't a scalar or a 1D or a (2, n) array like?为什么我不能绘制不是标量、一维或 (2, n) 数组的东西? 【发布时间】:2020-04-26 23:11:18 【问题描述】:

我是 python 新手,我需要为我的大学课程绘制图表。我收到此代码的值错误,我不知道如何解决它。我试图用np.asscalar 转换V 和m,但我没有得到任何改进。

ValueError: err must be a scalar or a 1D or (2, n) array-like

我认为问题出在错误栏中,但我真的很挣扎。

import numpy as np
from matplotlib import pyplot as plt
from scipy.optimize import curve_fit

m=np.array([np.loadtxt('masse.txt')]) 
sigma_m=np.array([np.loadtxt('errore_masse.txt')])
lati=np.array([np.loadtxt('lati.txt')])
sigma_lati=np.array(np.loadtxt('errore_lati.txt'))
h=np.array([np.loadtxt('altezze.txt')]) 
sigma_h=np.array([np.loadtxt('errore_altezza.txt')])

dc=np.array([6.45, 8.56, 10.45, 10.46])
hc=np.array([16.25, 40.80, 75., 17.67])
lpe=np.array([8.56])
a=np.array([7.41])
hpe=np.array([37.3])
lb=np.array([10.46])

rc=dc/2
Vc=2*np.pi*a**2 *hc
sigma_rc=sigma_lati/2
sigma_Vc=Vc*2*(0.01/dc)

Vpe=6*lpe*a*hpe
sigma_Vpe=((lpe*a)**2 *(0.01)**2 +(lpe*hpe)**2 *(0.01)**2 +(hpe*a)**2 *(0.01)**2)

Vp=lb**2
sigma_Vp=2*Vp*(0.01/lb)

V=np.array([np.loadtxt('volumi.txt')])
sigma_V=np.array([np.loadtxt('errore_volumi.txt')])

def line (x, a, q):
    """funzione retta
    """
    return a*x+q

plt.figure('Grafico massa-volume oggetti di ottone')
plt.errorbar(m, sigma_m, V, sigma_V, marker='.', fmt='.')

popt, pcov=curve_fit(m, V, line)

a_fit, q_fit= popt

sigma_a_fit, sigma_q_fit=np.sqrt(pcov.diagonal())

print(a_fit, q_fit, sigma_a_fit, sigma_q_fit)
x=np.linspace(10.675, 34.080, 10)
plt.plot(x, line(x, a_fit, q_fit))
plt.xlabel('Volume [mm$^3$]')
plt.ylabel('Massa [g]')
plt.grid (ls='dashed', which='both')

plt.show()

【问题讨论】:

当我查找 pyplot.errorbar 时,参数列表与您传递的参数不匹配:matplotlib.org/3.1.1/api/_as_gen/… -- 您使用的是什么版本? 【参考方案1】:

你得到的值错误是因为你在错误栏中混淆了你的值。有关用法,您应该查看the documentation。

您的问题源于此行:

plt.errorbar(m, sigma_m, V, sigma_V, marker='.', fmt='.')

首先,您应该使用m.shapesigma_m.shape 等检查所有这些变量的形状。它们都需要具有相同的形状,或者第二个 2 值应该是您切换的错误。如果它们是多维数组,那么您需要展平或使用索引来获取您想要的数组。假设 m 是你的 x 数据,V 是你的 y 数据,你应该有这样的东西:

plt.errorbar(m, V, xerr=sigma_m, yerr=sigma_V, marker='.', fmt='.')

由于您有一个 (1,N) 使用的多维数组:

plt.errorbar(m[0], V[0], xerr=sigma_m[0], yerr=sigma_V[0], marker='.', fmt='.')

【讨论】:

我检查了错误栏中所有四个参数的形状都是 (1, 5),我也尝试输入 xerr 和 yerr 但没有任何改变。我应该尝试改变参数的形状吗? 这是你的错误的一部分,你需要一个一维数组而不是二维。您可以通过索引m[0]V[0] 等值来删除 1 不客气,考虑投票或将问题标记为已回答,以便其他人受益。

以上是关于为啥我不能绘制不是标量、一维或 (2, n) 数组的东西?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能像行一样简单地获得一维数组?

二维数组名不能赋值给二级指针- -

为啥多维数组第一维的大小可以是任意的

如何得到一个一维标量数组作为一个学说dql查询结果?

我正在尝试登录并检查用户是不是存在,但我的执行标量一直返回 null,我不知道为啥?

这个二维数组为啥里面要有大括号呢?为啥风格成4个?难道不是4×4=16个元素吗?