Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用fill_-between函数绘制直线拟合中的不确定性;包含多个元素的数组的真值不明确。”;_Python_Python 3.x_Matplotlib_Graph - Fatal编程技术网

Python 使用fill_-between函数绘制直线拟合中的不确定性;包含多个元素的数组的真值不明确。”;

Python 使用fill_-between函数绘制直线拟合中的不确定性;包含多个元素的数组的真值不明确。”;,python,python-3.x,matplotlib,graph,Python,Python 3.x,Matplotlib,Graph,所以我试着写一段代码,它将采用线性拟合(参数具有给定的不确定性)并绘制不确定性范围。为此,我编写了以下代码: T = np.insert(xdata, 0, absolute_zero) maxi = lambda x_var: max([ Linear(tuple([parameters[0]+sd_parameters[0], parameters[1]+sd_parameters[1]]), x_var), Linear

所以我试着写一段代码,它将采用线性拟合(参数具有给定的不确定性)并绘制不确定性范围。为此,我编写了以下代码:

T = np.insert(xdata, 0, absolute_zero)
maxi = lambda x_var: max([
                 Linear(tuple([parameters[0]+sd_parameters[0], parameters[1]+sd_parameters[1]]), x_var), 
                 Linear(tuple([parameters[0]+sd_parameters[0], parameters[1]-sd_parameters[1]]), x_var),
                 Linear(tuple([parameters[0]-sd_parameters[0], parameters[1]+sd_parameters[1]]), x_var),
                 Linear(tuple([parameters[0]-sd_parameters[0], parameters[1]-sd_parameters[1]]), x_var)])
mini = lambda x_var: min([
                 Linear(tuple([parameters[0]+sd_parameters[0], parameters[1]+sd_parameters[1]]), x_var), 
                 Linear(tuple([parameters[0]+sd_parameters[0], parameters[1]-sd_parameters[1]]), x_var),
                 Linear(tuple([parameters[0]-sd_parameters[0], parameters[1]+sd_parameters[1]]), x_var),
                 Linear(tuple([parameters[0]-sd_parameters[0], parameters[1]-sd_parameters[1]]), x_var)])
plt.fill_between(T, maxi(T), mini(T))
其中,线性()函数的定义如下:

def Linear(p, x):
   factor, constant = p
   return(factor * x + constant)
但此代码返回错误

ValueError:包含多个元素的数组的真值不明确。使用a.any()或a.all()

虽然我知道这可能是因为我给了一个非数组函数一个数组,但我不知道如何求解它,因为这就是fill_的工作原理。尝试以下形式:

plt.fill_between(T, 
                 Linear(tuple([parameters[0]+sd_parameters[0], parameters[1]-sd_parameters[1]]), x_var),
                 Linear(tuple([parameters[0]-sd_parameters[0], parameters[1]+sd_parameters[1]]), x_var)
)
确实有效,但没有达到预期效果

提前感谢您的帮助

编辑:更完整的代码

import numpy as np
import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
import scipy.optimize as opt
import scipy.odr as ODR

def Linear(p, x):
   factor, constant = p
   return(factor * x + constant)

# Define data
tdata = [20.3, 30, 40, 50, 60, 70, 80, 90]
vdata = [58, 60, 63, 66, 68, 70, 70, 72]

xdata = np.array(tdata)
xerr = np.array(abs(0.01*xdata))

ydata = np.array(vdata)
yerr = np.ones(len(ydata))

# Fit to the linear model
Linear_model = ODR.Model(Linear)
data = ODR.RealData(xdata, ydata, sx = xerr, sy = yerr)
odr = ODR.ODR(data, Linear_model, beta0 = [0.2, 65])
out = odr.run()
out.pprint()
parameters = out.beta
sd_parameters = out.sd_beta

absolute_zero = -parameters[1]/parameters[0]

print("We find parameters: " + str(parameters) + " $\pm$ " + str(sd_parameters) + ".\n And an absolute 0 of " + str(absolute_zero))

# Start plotting
T = np.insert(xdata, 0, absolute_zero)
maxi = lambda x_var: max([
                 Linear(tuple([parameters[0]+sd_parameters[0], parameters[1]+sd_parameters[1]]), x_var), 
                 Linear(tuple([parameters[0]+sd_parameters[0], parameters[1]-sd_parameters[1]]), x_var),
                 Linear(tuple([parameters[0]-sd_parameters[0], parameters[1]+sd_parameters[1]]), x_var),
                 Linear(tuple([parameters[0]-sd_parameters[0], parameters[1]-sd_parameters[1]]), x_var)])
mini = lambda x_var: min([
                 Linear(tuple([parameters[0]+sd_parameters[0], parameters[1]+sd_parameters[1]]), x_var), 
                 Linear(tuple([parameters[0]+sd_parameters[0], parameters[1]-sd_parameters[1]]), x_var),
                 Linear(tuple([parameters[0]-sd_parameters[0], parameters[1]+sd_parameters[1]]), x_var),
                 Linear(tuple([parameters[0]-sd_parameters[0], parameters[1]-sd_parameters[1]]), x_var)])
plt.fill_between(T, maxi(T), mini(T))
plt.plot(T, Linear(parameters, T))
plt.errorbar(xdata, ydata, xerr= xerr, yerr=yerr, fmt = '.')
plt.plot([absolute_zero], [0], '.')
plt.text(x=absolute_zero+10, y=-1, s="(0,"+ str(round(absolute_zero,2)) + ")")
plt.xlabel('Temperature (°C)')
plt.ylabel('Volume (ml)')
plt.grid()
plt.show()

如果给定一个数组作为输入,
Linear
也将输出一个数组。计算两个或多个数组的最小值通常会失败,例如考虑

a = np.array([2,5])
b = np.array([3,4])
min([a,b]) # will fail as it is unclear which of the two arrays is smaller
相反,您希望查找元素方面的最小值和最大值。使用numpy可以很容易地完成这一点,在具有列的数组的水平轴上取最小值

np.min(np.c_[a,b], axis=1) # returns [2,4]
或者类似地,沿具有行的数组的垂直轴取最小值

np.min(np.r_[a,b], axis=0) 
在这个问题中,这看起来像

T = np.insert(xdata, 0, absolute_zero)
maxi = lambda x_var: np.max(np.c_[
                 Linear(tuple([parameters[0]+sd_parameters[0], parameters[1]+sd_parameters[1]]), x_var), 
                 Linear(tuple([parameters[0]+sd_parameters[0], parameters[1]-sd_parameters[1]]), x_var),
                 Linear(tuple([parameters[0]-sd_parameters[0], parameters[1]+sd_parameters[1]]), x_var),
                 Linear(tuple([parameters[0]-sd_parameters[0], parameters[1]-sd_parameters[1]]), x_var)], axis=1)
mini = lambda x_var: np.min(np.c_[
                 Linear(tuple([parameters[0]+sd_parameters[0], parameters[1]+sd_parameters[1]]), x_var), 
                 Linear(tuple([parameters[0]+sd_parameters[0], parameters[1]-sd_parameters[1]]), x_var),
                 Linear(tuple([parameters[0]-sd_parameters[0], parameters[1]+sd_parameters[1]]), x_var),
                 Linear(tuple([parameters[0]-sd_parameters[0], parameters[1]-sd_parameters[1]]), x_var)], axis=1)
plt.fill_between(T, maxi(T),mini(T) )

你忘了告诉我想要的结果是什么。由于输入未知,输出未知,我们能做些什么来帮助您呢?期望的结果是在一条单独的线周围创建一个合适的带,因为因子和常数都可以在不确定性中变化,我想在这些变化的最大值和最小值之间着色。这应该给出一个永远不会超过线性预测值的带(tuple([parameters[0],parameters[1]],T)),你可能想要取最小和最大元素?!如果您提供了带有一些输入参数并定义了
T
,我可以在代码中向您演示如何执行。@ImportanceOfBeingErnest我编辑了文章以包含相关代码。调用fill_between函数时会出现问题。