Python读取JDX文件绘制红外光谱时的两类问题求助
问题解决思路
问题1:KeyError: 'yunits'
JDX文件的元数据字段没有统一标准,部分文件可能不包含yunits键。直接通过字典索引取值会触发KeyError,改用dict.get()方法安全获取,同时设置默认值避免报错:
plt.ylabel(jcamp_dict.get('yunits', '吸光度')) # 缺失字段时用默认值替代
问题2:图表无光谱曲线
空图表大概率是x轴范围设置与实际数据不匹配,导致曲线被完全裁切,可按以下步骤排查:
- 检查数据范围:先打印转换后的x轴数值范围,确认是否在你设置的
plt.xlim(3.2, 3.6)区间内:
如果数据不在3.2-3.6之间,要么调整x_data = (1 / jcamp_dict['x']) * 10000 print(f"x数据范围:{min(x_data)} - {max(x_data)}")xlim参数,要么确认波数转微米的公式(公式10000 / 波数是正确的)。 - 验证数据完整性:确保
jcamp_dict['x']和jcamp_dict['y']的元素数量一致,否则plt.plot无法生成曲线:print(f"x长度:{len(jcamp_dict['x'])}, y长度:{len(jcamp_dict['y'])}") - 确认文件读取正常:打印
jcamp_dict的键列表,检查是否包含核心的'x'和'y'字段:print(jcamp_dict.keys())
修正后的完整代码
import jcamp import matplotlib.pyplot as plt import os from glob import glob import tqdm cp = os.getcwd() # 用原始字符串避免路径转义问题 for fn in tqdm.tqdm(sorted(glob(r'Fichier_jdx\*.jdx'))): dn = os.path.join(cp, fn) jcamp_dict = jcamp.jcamp_read(dn) # 跳过缺少核心数据的文件 if 'x' not in jcamp_dict or 'y' not in jcamp_dict: print(f"文件 {fn} 缺少x或y数据,跳过") continue x_data = (1 / jcamp_dict['x']) * 10000 y_data = jcamp_dict['y'] # 打印数据范围用于调试 print(f"处理文件 {fn}:x范围 {min(x_data):.2f} - {max(x_data):.2f} μm") f1 = plt.figure() plt.plot(x_data, y_data) plt.xlabel("µm") plt.ylabel(jcamp_dict.get('yunits', '吸光度')) plt.grid(ls='--') plt.title(os.path.basename(fn)[:-4], loc='center') # 用os.path.basename获取文件名更可靠 # 可根据实际数据调整xlim,或注释让matplotlib自动适配 # plt.xlim(3.2, 3.6) plt.savefig(dn[:-4] + ".jpg", dpi=1200) plt.close(f1) # 关闭画布释放内存
内容的提问来源于stack exchange,提问作者Fake47
相关产品推荐
相关产品推荐

