Matplotlib调用ax.plot绘图报x/y维度不可超过2维错误如何解决
报错原因
从错误返回的数组形状(2,) and (2, 1, 991)可以直接定位两个根因:
- Matplotlib的
ax.plot()仅支持传入维度不超过2维的x、y数据,且x和y的首个维度长度必须匹配。你传入的dat2[:]和直接写dat2效果完全一致,没有做任何维度裁剪,保留了三维结构,直接触发了维度超限的报错。 - 你传入的x轴数据
wl2是长度为2的一维数组,和dat2实际的光谱采样点长度991完全不匹配,就算把三维问题解决,也会触发x/y长度不匹配的报错,说明你要么取错了波长数组变量,要么读入数据时没有正确提取对应波段的波长序列。
修复方法
按以下步骤调整即可:
- 用
np.squeeze()处理dat2,自动删除所有长度为1的冗余维度,处理后dat2形状会从(2,1,991)变成二维的(2,991),对应两条长度为991的光谱数据。 - 明确你要绘制的光谱序号,通过索引取出一维的光谱流量数据:要画第一条就取
np.squeeze(dat2)[0],第二条就取np.squeeze(dat2)[1],处理后y数据是长度991的一维数组。 - 替换错误的
wl2变量:使用和991个采样点一一对应的一维波长数组,比如你代码里用来画黑色光谱的wl如果长度是991,直接用wl即可;如果wl2存的是其他内容,就重新读取对应区间的波长序列,保证x数组长度和y数组完全一致。 - 额外校验:绘图前可以执行
print(你的x数组.shape, 你的y数组.shape),确认输出是两个相同长度的一维元组(比如(991,) (991,)),再执行绘图就不会触发维度相关报错。
修正后的参考代码
import numpy as np import matplotlib.pyplot as plt fig, ax = plt.subplots(figsize=(12,8)) # 绘制第一条黑色参考光谱 ax.plot(wl, np.squeeze(dat), color='black') # 处理dat2冗余维度,这里以提取第一条绿色光谱为例,要画第二条把索引改成1即可 dat2_plot = np.squeeze(dat2)[0] # 这里x轴用wl,如果你确认有长度匹配的正确wl2,可替换回wl2 ax.plot(wl, dat2_plot, color='green') ax.axvline(4861.32, color='b', linewidth=1) ax.text(4861.32 + 0.2, np.mean(dat) + 4.8*np.std(dat), "H"+ r'$\beta$', fontsize=10, color='b') ax.set_title('Spectra', fontsize=15) ax.set_xlabel(r'Wavelength [$\mathrm{\AA}$]', fontsize=15) ax.set_ylabel(r'Flux [erg/cm2/cm/A]', fontsize=15) ax.set_xlim(3700,5000) # y轴范围计算用处理后的一维dat2_plot,避免三维数组计算出异常的统计值 ax.set_ylim([np.mean(dat2_plot) - 1.5*np.std(dat2_plot), np.mean(dat2_plot) + 2*np.std(dat2_plot)])
注意:不要用
dat2[:]这种写法试图降维,切片操作如果不指定具体索引范围,只会返回原数组的视图,维度和原数组完全一致,起不到压缩维度的作用。
内容的提问来源于stack exchange,提问作者samane filabi
相关产品推荐
相关产品推荐

