我有一个功能,并且已经检测到该功能的峰值。我取了每个峰高的一半,现在我想找到函数和经过峰高一半的线之间的交点,仅在左侧。
请注意,在下图中,该线未完全通过峰的一半。确实,每个峰都有一个特定的中间高度值,我需要用这个值在左侧找到交点。
我的函数值是:
data= [2.50075550e+01 2.68589513e+01 2.88928569e+01 3.05468408e+01
3.17558878e+01 3.28585597e+01 3.41860820e+01 3.56781188e+01
3.68868815e+01 3.72671655e+01 3.65050587e+01 3.47342596e+01
3.24647483e+01 3.02772213e+01 2.84592589e+01 2.68653782e+01
2.51627240e+01 2.33132310e+01 2.18235229e+01 ...]
我使用SciPy的find_peaks达到了一半的高度
heights.append(signal.find_peaks(data, height=height)[1]['peak_heights'])
#Then calculating the half of each peak
下面的代码使用函数find_roots
从如何找到其中y == 0曲线的交点准确?。此函数搜索与给定半值相对应的精确内插x值。该段仅限于前一个峰和当前峰之间的间隔,并且从结果列表中获取最后一个根(如果有)。
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
def find_roots(x, y):
s = np.abs(np.diff(np.sign(y))).astype(bool)
return x[:-1][s] + np.diff(x)[s] / (np.abs(y[1:][s] / y[:-1][s]) + 1)
np.random.seed(11235)
x = np.linspace(0, 20, 500)
data = np.convolve(1.1 ** np.random.randn(x.size).cumsum(), np.ones(40), 'same')
data -= data.min()
plt.plot(x, data, c='dodgerblue')
peaks, _ = signal.find_peaks(data, height=40, distance=50)
plt.scatter(x[peaks], data[peaks], color='turquoise')
for p, prev in zip(peaks, np.append(0, peaks)):
half = data[p] / 2
roots = find_roots(x[prev:p], data[prev:p] - half)
if len(roots) > 0:
plt.scatter(roots[-1], half, color='crimson')
plt.ylim(ymin=0)
plt.show()
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句