首页 > 解决方案 > 在 Plot Python 中获取峰值

问题描述

我有以下数据:

data = np.array([ 0.,  0.,  0., 94., 30., 30., 30., 31., 29., 30., 29., 28., 26.,
       29., 28., 29., 31., 32., 31., 29., 31., 31., 30., 34., 28., 31.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  2.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0., 54.,  9.,  9.,  7.,  7.,
       14., 18., 13.,  8.,  2.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.])

如果我绘制它,它看起来像这样:

在此处输入图像描述

现在,我想自动识别红色的点。知道我该怎么做吗?

编辑: 试过了scipy.signal,但它没有正确检测到峰值,至少在默认配置下:

from matplotlib import pyplot as plt
from scipy.signal import find_peaks
peaks, _ = find_peaks(data, height=20)
plt.plot(data)
plt.plot(peaks, data[peaks], "x")
plt.show()

在此处输入图像描述

标签: pythonpython-3.xnumpy

解决方案


有道格拉斯-普克算法,见https://stackoverflow.com/a/49377181/562769

这个想法是简化这条线,直到你只剩下最相关的点。然后你把每个点都放在阈值之上(例如高于平均值),你就有了峰值。

依稀记得scipy信号处理有更复杂的方法


推荐阅读