使用numpy/scipy.trapz积分非基线起始信号峰及可视化需求
信号峰积分:可视化未校正区域与基线校正方法
我正尝试用numpy.trapz或scipy.trapz对信号峰手动选择起止范围进行积分,但这些函数默认会计算到基线(y=0)的AUC,而我的信号有时起止点高于基线。我可接受基线校正方法,但需先可视化未校正的积分区域以验证范围准确性。

示例数据生成
import numpy import peakutils from matplotlib import pyplot centers = (30.5, 72.3) x = numpy.linspace(0, 120, 121) y = (peakutils.gaussian(x, 5, centers[0], 3) + peakutils.gaussian(x, 7, centers[1], 10) + numpy.random.rand(x.size)) pyplot.figure(figsize=(10,6)) pyplot.plot(x, y) pyplot.title("含噪声的信号数据") pyplot.show()

一、可视化未校正的积分区域
手动选定峰的起止索引后,通过填充色直观展示积分范围,验证选择是否准确:
# 手动指定峰的起止x值(示例为第一个峰:x=20到x=40) start_idx = numpy.where(x == 20)[0][0] end_idx = numpy.where(x == 40)[0][0] x_peak = x[start_idx:end_idx+1] y_peak = y[start_idx:end_idx+1] # 绘制可视化图 pyplot.figure(figsize=(10,6)) pyplot.plot(x, y, label='原始信号') # 填充从基线(y=0)到信号曲线的积分区域 pyplot.fill_between(x_peak, 0, y_peak, color='orange', alpha=0.3, label='未校正积分区域') # 标记起止点 pyplot.scatter([x[start_idx], x[end_idx]], [y[start_idx], y[end_idx]], color='red', s=50, label='起止点') pyplot.legend() pyplot.title("未校正的积分区域可视化") pyplot.show() # 计算未校正的AUC值 auc_uncorrected = numpy.trapz(y_peak, x_peak) print(f"未校正的AUC值:{auc_uncorrected:.2f}")
二、基线校正后的积分
若起止点高于基线,取起止点y值的平均值作为校正基线,计算峰相对该基线的AUC:
# 计算校正基线(起止点y值的平均值) baseline = (y[start_idx] + y[end_idx]) / 2 # 生成校正后的信号值 y_corrected = y_peak - baseline # 绘制校正后的可视化图 pyplot.figure(figsize=(10,6)) pyplot.plot(x, y, label='原始信号') pyplot.hlines(baseline, x[start_idx], x[end_idx], color='green', linestyle='--', label='校正基线') # 填充从校正基线到信号曲线的积分区域 pyplot.fill_between(x_peak, baseline, y_peak, color='blue', alpha=0.3, label='校正后积分区域') pyplot.scatter([x[start_idx], x[end_idx]], [y[start_idx], y[end_idx]], color='red', s=50, label='起止点') pyplot.legend() pyplot.title("基线校正后的积分区域可视化") pyplot.show() # 计算校正后的AUC值 auc_corrected = numpy.trapz(y_corrected, x_peak) print(f"基线校正后的AUC值:{auc_corrected:.2f}")
内容的提问来源于stack exchange,提问作者PPenton
相关产品推荐
相关产品推荐

