我在尝试查找某些数据的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参数。

10-01 13:18