求VS Code环境下Python提取GC色谱峰保留时间与峰面积代码
气相色谱(GC)数据峰提取与分析Python方案
需求概述
处理CSV格式的气相色谱数据,提取所有峰的保留时间(Retention Time)和峰面积(Peak Area),生成带编号的峰列表,同时可在VS Code中运行并可视化色谱图。现有R代码仅能识别首个峰,需替换为Python实现。
可直接运行的Python代码
import pandas as pd import numpy as np import matplotlib.pyplot as plt from scipy.signal import find_peaks from scipy.integrate import simpson # 1. 读取CSV数据(替换为你的文件路径) csv_path = "your_gc_data.csv" df = pd.read_csv(csv_path) # 假设CSV列名为"RT"(保留时间)和"TIC"(信号强度),列名不同请自行修改 rt = df["RT"].values tic = df["TIC"].values # 2. 峰检测参数调整(可根据实际数据修改) # height: 峰的最小高度,过滤噪音;distance: 峰之间的最小采样点距离 peaks, properties = find_peaks(tic, height=100, distance=50) # 3. 计算每个峰的面积(使用辛普森积分) peak_areas = [] for peak_idx in peaks: # 确定峰的左右基线边界 peak_pos = np.where(peaks == peak_idx)[0][0] left_bound = 0 if peak_pos == 0 else (peaks[peak_pos-1] + peak_idx) // 2 right_bound = len(tic)-1 if peak_pos == len(peaks)-1 else (peak_idx + peaks[peak_pos+1]) // 2 # 对峰区间的信号积分 area = simpson(tic[left_bound:right_bound+1], rt[left_bound:right_bound+1]) peak_areas.append(area) # 4. 生成带编号的峰列表 peak_list = pd.DataFrame({ "峰编号": range(1, len(peaks)+1), "保留时间(sec)": [round(rt[p], 3) for p in peaks], "峰面积": [round(a, 2) for a in peak_areas] }) # 打印峰列表 print("峰提取结果:") print(peak_list) # 5. 可视化色谱图并标注峰信息 plt.figure(figsize=(12, 6)) plt.plot(rt, tic, label="TIC信号") plt.scatter(rt[peaks], tic[peaks], color="red", marker="o", label="检测到的峰") # 标注每个峰的RT和面积 for i, (p_rt, p_area) in enumerate(zip(rt[peaks], peak_areas)): plt.text(p_rt + 0.5, tic[peaks][i] + 50, f"峰{i+1}\nRT: {round(p_rt,3)}s\n面积: {round(p_area,2)}", fontsize=8, bbox=dict(facecolor='white', alpha=0.8)) plt.xlabel("保留时间(sec)") plt.ylabel("信号强度(TIC)") plt.title("气相色谱图峰标注") plt.legend() plt.grid(alpha=0.3) plt.show() # 可选:将峰列表保存为CSV peak_list.to_csv("gc_peak_results.csv", index=False)
使用说明
- 依赖安装:在VS Code终端运行以下命令安装所需库:
pip install pandas numpy matplotlib scipy - 路径与列名修改:将代码中的
csv_path替换为你的GC数据CSV文件路径;如果CSV的列名不是"RT"和"TIC",请同步修改代码中对应的列名。 - 参数调整:
find_peaks中的height:设置峰的最小高度,过滤低强度噪音峰distance:设置峰之间的最小采样点距离,避免识别过近的假峰- 积分边界逻辑可根据实际色谱峰的基线情况微调
- 运行:在VS Code中直接运行脚本,会输出峰列表、显示带标注的色谱图,同时可选将结果保存为CSV文件。
现有R代码问题说明
你提供的R代码中,findpeaks调用时传入的是x(一个0到1的序列)而非实际的TIC信号,导致峰检测逻辑错误;且DrawChromatogram默认仅返回首个峰,因此无法提取所有峰信息。上述Python代码直接基于原始信号处理,可正确识别所有符合条件的峰。
内容的提问来源于stack exchange,提问作者piupiu
相关产品推荐
相关产品推荐

