MATLAB转Python后光谱合并绘图异常问题求助
修复合并光谱图异常的解决方案
常见问题及修复步骤
移除冲突的Matplotlib后端指令
同时启用%matplotlib inline和%matplotlib widget会导致渲染冲突,只保留其中一个即可(推荐用%matplotlib widget实现交互式绘图,或inline生成静态图)。处理MATLAB数组的维度问题
MATLAB导出的.mat文件中,数组通常是二维结构(比如形状为(1, N)),直接索引会得到二维数组,需要用.flatten()或.squeeze()转为一维数组,避免绘图时出现异常。优化图例显示
如果谱线数量较多,过多的图例会导致图表混乱,可以选择只显示文件级别的标签,或者通过ncol参数调整图例布局。验证数据匹配性
确保每个频率数组和对应的振幅数组长度一致,避免因维度不匹配导致绘图错误。
修改后的完整代码
import os import matplotlib.pyplot as plt from scipy.io import loadmat # 只保留一个后端指令,二选一 %matplotlib widget # %matplotlib inline # 指定.mat文件目录 mat_files_directory = '/Users/XXXX/Desktop/Tau Ceti/' # 筛选目标文件 mat_files = [file for file in os.listdir(mat_files_directory) if file.endswith('wcal.mat')] # 存储所有数据 all_line_frequencies = [] all_line_amplitudes = [] for mat_file in mat_files: mat_data = loadmat(os.path.join(mat_files_directory, mat_file)) # 提取数据并处理维度 spectrum_amplitude = mat_data['fib4_spec'] spectrum_wave = mat_data['fib4_spec_wave'] # 将二维数组转为一维(适配MATLAB导出的数据结构) all_line_frequencies.append(spectrum_wave.squeeze()) all_line_amplitudes.append(spectrum_amplitude.squeeze()) # 创建绘图 plt.figure(figsize=(14, 8)) for file_index, (frequencies, amplitudes) in enumerate(zip(all_line_frequencies, all_line_amplitudes), 1): # 检查数据形状,确保是二维(每行对应一条谱线) if amplitudes.ndim == 2: num_lines = amplitudes.shape[0] for line_index in range(num_lines): line_freq = frequencies[line_index].flatten() line_amp = amplitudes[line_index].flatten() # 优化标签:如果谱线太多,可只保留文件标签 plt.plot(line_freq, line_amp, label=f'文件 {file_index} 谱线 {line_index+1}') else: # 单条谱线的情况 plt.plot(frequencies.flatten(), amplitudes.flatten(), label=f'文件 {file_index}') plt.xlabel('频率') plt.ylabel('振幅') plt.title('合并光谱对比图') # 调整图例布局,避免重叠 plt.legend(ncol=2, bbox_to_anchor=(1.05, 1), loc='upper left') plt.tight_layout() plt.show()
额外建议
- 如果异常是折线混乱、不连续,大概率是MATLAB数组维度未处理导致的,
.squeeze()和.flatten()可解决该问题。 - 若图表未显示,检查
matplotlib是否正确安装,后端指令是否生效。 - 可添加
print(spectrum_wave.shape)这类语句,确认数据维度是否符合预期。
内容的提问来源于stack exchange,提问作者AlbPet
相关产品推荐
相关产品推荐

