2017-03-07 59 views
2

我使用scipy.optimize.curve_fit()繪製了線性最小二乘擬合曲線。我的數據有一些與它相關的錯誤,我在繪製擬合曲線時添加了這些錯誤。在scipy上繪製曲線擬合線上的一個西格瑪誤差線

接下來,我想繪製兩條虛線,代表這兩條線之間的曲線擬合和陰影區域上的一個西格瑪誤差條。這是我到目前爲止已經試過:

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() 

不過,我認爲虛線畫出我需要一個西格瑪錯誤從我提供的外部數據和YDATA numpy的陣列,而不是從曲線擬合。我是否必須知道滿足我的擬合曲線的座標,然後製作第二個數組來製作一個西格瑪誤差擬合曲線?

enter image description here

回答

2

似乎你畫兩條完全不同的線路。

取而代之,您需要繪製三條線:第一條是沒有任何更正的情況,另外兩條線應該使用相同的參數ab,但帶有增加或減少的sigma。您可以從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

您可以將相同的技術爲其他行,如果你想要的。