我在尝试查找某些数据的FWHM时遇到问题。我最初尝试使用interpolate.interp1d
拟合曲线。有了这个,我能够创建一个函数,当我输入一个x值时,它将返回一个内插的y值。问题是我需要与此功能相反。换句话说,我想切换我的独立变量和因变量。当我尝试切换它们时,由于必须对独立数据进行排序,因此会出现错误。如果对数据进行排序,则将丢失索引,因此将丢失图形的形状。
我试过了:
x = np.linspace(0, line.shape[0], line.shape[0])
self.x_curve = interpolate.interp1d(x, y, 'linear')
其中
y
是我的数据。为了得到相反的结果,我尝试了:
self.x_curve = interpolate.interp1d(sorted(y), x, 'linear')
但值已关闭。
然后,我继续尝试使用UnivariateSpline并获取根来查找FWHM(此问题来自Finding the full width half maximum of a peak),但是roots()方法始终为我提供一个空列表
[]
。这是我使用的:
x_curve = interpolate.UnivariateSpline(x, y)
r = x_curve.roots()
print(r)
这是数据的图像(带有UnivariateSpline):
有任何想法吗?谢谢。
最佳答案
仅当您移动数据以使其在FWHM处的值为0时,使用UnivariateSpline.roots()
来获取FWHM才有效。
看到数据的背景嘈杂,我先估算一下基线。例如:
y_baseline = y[(x<200) & (x>350)].mean()
(请根据需要调整
x
的限制)。然后移动数据,使基线和峰的中间为0。如示例所示,看到您的数据有最小值而不是最大值,我使用的是y.min()
:y_shifted = y - (y.min()+y_baseline)/2.0
现在,将样条曲线拟合到该移位后的数据,并且
roots()
应该能够找到根,其不同之处在于FWHM。x_curve = interpolate.UnivariateSpline(x, y_shifted, s=0)
x_curve.roots()
如果要根据平滑数据估算FWHM,请增加
s
参数。