Matplotlib绘制二维星系光谱图的Y轴问题求助
解决方案
问题1:Y轴标签全为正
物理上半径应为非负值,我们可以保留原有的相对中心偏移计算(区分上下位置),但将Y轴的刻度标签替换为绝对值,这样显示的所有半径都是正数。
问题2:0刻度对齐中心
原代码中imshow的extent参数Y轴范围顺序错误,导致0刻度位置偏移。extent的正确格式是(xmin, xmax, ymin, ymax),需将Y轴范围从(radii[0], radii[-1])改为(radii[-1], radii[0]),确保Y轴从负偏移(图像底部)到正偏移(图像顶部),中心的0刻度会准确对应y=596的位置。
修改后的完整代码
import numpy as np import matplotlib.pyplot as plt # 假设已定义 data_gal, lam_gal, fig_dim y_vals = np.arange(1125) # 计算相对于中心的偏移(正为图像上半部分,负为下半部分) radii = 0.2 * (596 - y_vals) fig, ax = plt.subplots(1, 1, figsize=fig_dim) # 修正extent的Y轴范围顺序,确保0刻度对齐中心 im = ax.imshow( data_gal, cmap='binary', extent=(lam_gal[0], lam_gal[-1], radii[-1], radii[0]), origin='upper' ) # 设置轴标签与X轴范围 ax.set_xlabel('Wavelength') ax.set_xlim(4900, 5450) ax.set_ylabel('Radius (r)') # 将Y轴刻度标签替换为绝对值,显示正半径 yticks = ax.get_yticks() ax.set_yticklabels([f'{abs(tick):.1f}' for tick in yticks]) # 可选:手动添加0刻度确保显示 if 0 not in yticks: new_yticks = np.sort(np.append(yticks, 0)) ax.set_yticks(new_yticks) ax.set_yticklabels([f'{abs(tick):.1f}' for tick in new_yticks]) # 可选:添加颜色条展示数据强度 fig.colorbar(im, ax=ax) plt.show()
关键修改说明
- 修正extent参数:将Y轴范围从
(radii[0], radii[-1])改为(radii[-1], radii[0]),匹配imshow的(xmin, xmax, ymin, ymax)格式,确保图像的像素位置与Y轴刻度正确对应,0刻度精准对齐中心y=596。 - 自定义Y轴标签:通过
get_yticks()获取当前刻度,将每个刻度值取绝对值后重新设置标签,保证所有显示的半径为正,符合物理逻辑。
内容的提问来源于stack exchange,提问作者trynerror
相关产品推荐
相关产品推荐

