在scipy上的曲线拟合线上绘制一个sigma误差条

时间:2017-03-07 20:57:39

标签: python optimization plot scipy

我使用scipy.optimize.curve_fit()绘制了线性最小二乘拟合曲线。我的数据有一些与之相关的错误,我在绘制拟合曲线时添加了这些错误。

接下来,我想绘制两条虚线,表示曲线拟合上的一个sigma误差条和这两条线之间的阴影区域。这是我到目前为止所尝试的:

import sys
import os
import numpy
import matplotlib.pyplot as plt
from pylab import *
import scipy.optimize as optimization
from scipy.optimize import curve_fit


xdata = numpy.array([-5.6, -5.6, -6.1, -5.0, -3.2, -6.4, -5.2, -4.5, -2.22, -3.30, -6.15])
ydata = numpy.array([-18.40, -17.63, -17.67, -16.80, -14.19, -18.21, -17.10, -17.90, -15.30, -18.90, -18.62])

# Initial guess.
x0     = numpy.array([1.0, 1.0])
#data error
sigma = numpy.array([0.16, 0.16, 0.16, 0.16, 0.16, 0.16, 0.16, 0.16, 0.22, 0.45, 0.35])
sigma1 = numpy.array([0.000001, 0.000001, 0.000001, 0.0000001, 0.0000001, 0.13, 0.22, 0.30, 0.00000001, 1.0, 0.05])

#def func(x, a, b, c):
#    return a + b*x + c*x*x


def line(x, a, b):
    return a * x + b

#print optimization.curve_fit(line, xdata, ydata, x0, sigma)

popt, pcov = curve_fit(line, xdata, ydata, sigma =sigma)

print popt

print "a =", popt[0], "+/-", pcov[0,0]**0.5
print "b =", popt[1], "+/-", pcov[1,1]**0.5

#1 sigma error ######################################################################################
sigma2 = numpy.array([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0])          #make change
popt1, pcov1 = curve_fit(line, xdata, ydata, sigma = sigma2)                           #make change

print popt1

print "a1 =", popt1[0], "+/-", pcov1[0,0]**0.5
print "b1 =", popt1[1], "+/-", pcov1[1,1]**0.5
#####################################################################################################

plt.errorbar(xdata, ydata, yerr=sigma, xerr= sigma1, fmt="none")
plt.ylim(-11.5, -19.5)
plt.xlim(-2, -7)


xfine = np.linspace(-2.0, -7.0, 100)  # define values to plot the function for
plt.plot(xfine, line(xfine, popt[0], popt[1]), 'r-')
plt.plot(xfine, line(xfine, popt1[0], popt1[1]), '--')                                   #make change

plt.show()

但是,我认为我绘制的虚线从我提供的xdata和ydata numpy数组中获取了一个sigma错误,而不是曲线拟合。我是否必须知道满足我的拟合曲线的坐标,然后制作第二个数组以使一个sigma误差拟合曲线?

enter image description here

1 个答案:

答案 0 :(得分:2)

看来你正在绘制两条截然不同的线。

相反,您需要绘制三条线:第一条线是您的拟合而没有任何修正,另外两条线应使用相同的参数ab构建,但添加或减去西格玛。您可以从pcov中获得的协方差矩阵中获取相应的sigma。所以你会有类似的东西:

y  = line(xfine, popt[0], popt[1])
y1 = line(xfine, popt[0] + pcov[0,0]**0.5, popt[1] - pcov[1,1]**0.5)
y2 = line(xfine, popt[0] - pcov[0,0]**0.5, popt[1] + pcov[1,1]**0.5)

plt.plot(xfine, y, 'r-')
plt.plot(xfine, y1, 'g--')
plt.plot(xfine, y2, 'g--')
plt.fill_between(xfine, y1, y2, facecolor="gray", alpha=0.15)

fill_between遮挡错误条线之间的区域。

结果如下:

enter image description here

如果需要,您可以为其他行应用相同的技术。