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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 03:20:34