如何为scipy.signal.find_peaks检测到的峰值标注对应数值?
plt.plot() 不支持直接传入数值作为点位标记,你写的plt.plot(peaks, x[peaks], x[peaks])不符合接口参数规则——第三个位置参数是用来指定线条、标记样式的格式字符串,传入数值数组会被解析为非法格式,自然达不到预期效果。
要实现峰值数值标注,用plt.text()接口即可,两种常见效果的实现方式如下:
效果1:用峰值数值直接替换原有圆点标记
不需要额外画圆点,直接在峰值坐标位置写入数值文本即可:
import matplotlib.pyplot as plt import numpy as np from scipy.misc import electrocardiogram from scipy.signal import find_peaks # 加载示例心电数据 x = electrocardiogram()[2000:4000] peaks, _ = find_peaks(x, distance=150) plt.plot(x) # 遍历所有峰值点写入对应数值 for px, py in zip(peaks, x[peaks]): # ha/va设置文本水平、垂直居中对齐,和点位完全重合 plt.text(px, py, f"{py:.2f}", ha="center", va="center", fontsize=9) plt.show()
效果2:保留圆点标记,数值标注在点位附近
保留原有圆点标记,给数值加个坐标偏移,放在点的上方/侧方避免遮挡:
import matplotlib.pyplot as plt import numpy as np from scipy.misc import electrocardiogram from scipy.signal import find_peaks x = electrocardiogram()[2000:4000] peaks, _ = find_peaks(x, distance=150) plt.plot(x) # 先绘制原有红色圆点标记 plt.plot(peaks, x[peaks], '.', color='crimson') # 定义y轴偏移量,根据自己的数据范围调整大小避免重叠 y_bias = 0.12 for px, py in zip(peaks, x[peaks]): plt.text(px, py + y_bias, f"{py:.2f}", ha="center", fontsize=8, color='crimson') plt.show()
自定义调整提示
- 偏移量大小可以根据你自身数据的y轴取值范围灵活调整,避免标注文字和曲线、标记重叠
- 可以通过
plt.text()的fontsize、color、rotation参数自定义文字大小、颜色、旋转角度,适配高密度峰值的排版场景 - 数值显示的精度可以通过f-string的格式化参数调整,比如要显示整数就用
f"{py:.0f}"
内容的提问来源于stack exchange,提问作者hrokr
相关产品推荐
相关产品推荐

