Matplotlib 寻找峰值的半峰宽
在科学实验中,许多情况下需要获取信号中特定峰值的半峰宽(full width half maximum,FWHM)。原因在于,半峰宽通常被定义为从峰值的一侧到另一侧的信号值减少到峰值的一半所需的宽度。在光谱分析、药物研究、电子设备制造等方面的应用中极为常见。
在本文中,我们将使用Matplotlib库来帮助我们找到信号的半峰宽。
阅读更多:Matplotlib 教程
背景知识
在开始Matplotlib库的使用之前,让我们先了解一些相关的基础知识。
导入必要的库
我们需要导入以下库:
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
这些库分别用于数据处理、绘图以及拟合曲线。
生成数据
在本文中,我们将使用以下一维数据作为样例数据:
x = np.linspace(0, 10, 1000)
y = np.exp(-(x-5)**2) + np.exp(-(x-7)**2/2)
这是一个高斯型信号,它同时包含两个峰。我们将使用Matplotlib库来找到这两个峰的完整宽度。
使用Matplotlib库找到峰的完整宽度
接下来,我们将介绍如何使用Matplotlib库来找到峰的完整宽度。
绘制数据
首先,我们可以使用Matplotlib的plot
函数来可视化我们的数据:
plt.plot(x, y)
plt.xlabel('x')
plt.ylabel('y')
plt.show()
这将输出一个包含两个峰的图像。在这之后,我们需要找到这两个峰并拟合两个高斯函数。
寻找峰值
我们可以使用scipy
库中的find_peaks
函数来找到峰值:
from scipy.signal import find_peaks
peaks, _ = find_peaks(y)
这将返回一个包含峰值索引的数组。
我们还可以使用peak_prominences
和peak_widths
函数来找到峰的完整宽度:
from scipy.signal import peak_prominences, peak_widths
prominences = peak_prominences(y, peaks)[0]
widths_half, lefts, rights = peak_widths(y, peaks, rel_height=0.5)
这里的prominences
是峰的显著度,widths_half
数组包含两个峰的完整宽度,lefts
和rights
数组分别包含宽度的左侧和右侧边界值。
我们可以使用以下代码可视化我们的结果:
plt.plot(x, y)
plt.plot(x[peaks], y[peaks], "o")
plt.hlines(*widths_half, color="C2")
plt.show()
这将输出一个包含两个峰、带红色线段的完整宽度的图像。请注意,我们也可以通过改变rel_height
来找到峰的其他完整宽度。
总结
在本文中,我们介绍了如何使用Matplotlib库来在信号中找到峰的完整宽度。我们使用find_peaks
函数找到了峰值,并使用peak_prominences
和peak_widths
函数找到峰的完整宽度。最终可视化的输出包括图像和红色的完整宽度线段。这是一个广泛使用的技术,特别是在光谱分析、药物研究和电子设备制造等领域。有了这个技术,我们能够更好地理解信号,并提取出关键的属性,从而更深入地研究各种应用。
值得注意的是,在实际应用中,可能会存在更加复杂的信号,需要使用更加复杂的技术来获得更加准确的结果。希望这篇文章能够帮助您入门并了解这一应用。
参考资料
- Matplotlib: https://matplotlib.org/
- scipy.signal.find_peaks: https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.find_peaks.html
- scipy.signal.peak_prominences: https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.peak_prominences.html
- scipy.signal.peak_widths: https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.peak_widths.html