You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python读取JDX文件绘制红外光谱时的两类问题求助

问题解决思路

问题1:KeyError: 'yunits'

JDX文件的元数据字段没有统一标准,部分文件可能不包含yunits键。直接通过字典索引取值会触发KeyError,改用dict.get()方法安全获取,同时设置默认值避免报错:

plt.ylabel(jcamp_dict.get('yunits', '吸光度'))  # 缺失字段时用默认值替代

问题2:图表无光谱曲线

空图表大概率是x轴范围设置与实际数据不匹配,导致曲线被完全裁切,可按以下步骤排查:

  1. 检查数据范围:先打印转换后的x轴数值范围,确认是否在你设置的plt.xlim(3.2, 3.6)区间内:
    x_data = (1 / jcamp_dict['x']) * 10000
    print(f"x数据范围:{min(x_data)} - {max(x_data)}")
    
    如果数据不在3.2-3.6之间,要么调整xlim参数,要么确认波数转微米的公式(公式10000 / 波数是正确的)。
  2. 验证数据完整性:确保jcamp_dict['x']和jcamp_dict['y']的元素数量一致,否则plt.plot无法生成曲线:
    print(f"x长度:{len(jcamp_dict['x'])}, y长度:{len(jcamp_dict['y'])}")
    
  3. 确认文件读取正常:打印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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 17:01:26