我想在Python中將多條高斯曲線擬合爲質譜數據。現在,我一次將數據擬合成一個高斯 - 一次一個範圍。如何在Python中擬合多個高斯曲線到質譜數據?
有沒有更簡化的方法來做到這一點?有沒有辦法通過循環運行數據來在每個峯值處繪製高斯?我猜想有一個更好的方法,但我已經梳理了互聯網。
我的兩個高斯圖如下所示。
我的示例數據,可以發現:http://txt.do/dooxv
下面是我當前的代碼:
import numpy as np
import matplotlib.pyplot as plt
import scipy.optimize as opt
from scipy.interpolate import interp1d
RGAdata = np.loadtxt("/Users/ilenemitchell/Desktop/RGAscan.txt", skiprows=14)
RGAdata=RGAdata.transpose()
x=RGAdata[0]
y=RGAdata[1]
# graph labels
plt.ylabel('ion current')
plt.xlabel('mass/charge ratio')
plt.xticks(np.arange(min(RGAdata[0]), max(RGAdata[0])+2, 2.0))
plt.ylim([10**-12.5, 10**-9])
plt.title('RGA Data Jul 25, 2017')
plt.semilogy(x, y,'b')
#fitting a guassian to a peak
def gauss(x, a, mu, sig):
return a*np.exp(-(x-mu)**2/(2*sig**2))
fitx=x[(x>40)*(x<43)]
fity=y[(x>40)*(x<43)]
mu=np.sum(fitx*fity)/np.sum(fity)
sig=np.sqrt(np.sum(fity*(fitx-mu)**2)/np.sum(fity))
print (mu, sig, max(fity))
popt, pcov = opt.curve_fit(gauss, fitx, fity, p0=[max(fity),mu, sig])
plt.semilogy(x, gauss(x, popt[0],popt[1],popt[2]), 'r-', label='fit')
#second guassian
fitx2=x[(x>26)*(x<31)]
fity2=y[(x>26)*(x<31)]
mu=np.sum(fitx2*fity2)/np.sum(fity2)
sig=np.sqrt(np.sum(fity2*(fitx2-mu)**2)/np.sum(fity2))
print (mu, sig, max(fity2))
popt2, pcov2 = opt.curve_fit(gauss, fitx2, fity2, p0=[max(fity2),mu, sig])
plt.semilogy(x, gauss(x, popt2[0],popt2[1],popt2[2]), 'm', label='fit2')
plt.show()
請問您可以提供一些示例數據嗎?另外,您是否可以用箭頭顯示圖像,以表明您希望用高斯擬合突出顯示什麼? – fsimkovic
當然。我剛剛更新了照片(上面鏈接)。我還上傳了一個示例數據的鏈接。 Thx – MsPhyz
您必須想出一種方法來識別峯值及其周圍的範圍,很可能使用滾動窗口技術。一旦你寫了這個函數,你可以遍歷整個數據集。 –