求助:为MALDI图谱标注指定局部最大值(峰值)
解决方案
要给指定m/z的峰值柱形添加标注,你可以通过以下步骤修改代码:
- 将读取的x、y数据转为numpy数组,方便快速定位目标值;
- 定义需要标注的目标m/z列表,遍历每个目标值,找到对应柱形的坐标后,用
plt.text()添加标注; - 调整标注的位置,避免与柱形重叠。
修改后的完整代码:
import matplotlib.pyplot as plt import numpy as np x = [] y = [] for line in open('Maldi', 'r'): lines = [i for i in line.split()] x.append(float(lines[0])) y.append(float(lines[1])) # 转为numpy数组方便查找 x = np.array(x) y = np.array(y) plt.title("Spectra") plt.xlabel('m/z') plt.ylabel('Intensity') plt.bar(x, y, width=0.05) # 指定需要标注的目标m/z target_mzs = [630, 637, 690] for mz in target_mzs: # 找到对应mz的索引(考虑浮点精度,用近似匹配) idx = np.where(np.isclose(x, mz, atol=0.1))[0][0] # 获取对应的强度值 intensity = y[idx] # 在柱形上方添加标注,位置稍微上移避免重叠 plt.text(x[idx], intensity + max(y)*0.01, f"{mz}", ha='center', fontsize=10) plt.xlim([500, 1000]) plt.show()
说明:
- 使用
np.isclose()做近似匹配,避免因浮点精度问题找不到目标m/z; ha='center'让标注在柱形正上方居中;- 标注的y轴位置加上了
max(y)*0.01作为偏移,你可以根据实际图谱调整这个数值,让标注位置更美观。
内容的提问来源于stack exchange,提问作者mudeer445589
相关产品推荐
相关产品推荐

