我在尝试查找某些数据的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):
有什么想法吗?感谢。
答案 0 :(得分:2)
使用UnivariateSpline.roots()
获取FWHM只有在您移动数据以使其值在FWHM为0时才有效。
看到数据的背景是嘈杂的,我首先估计基线。例如:
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
参数。