基于Matplotlib绘制含银道与赤道投影网格的全天源散点图
在全天散点图中同时展示赤道与银道坐标系网格
想要在Aitoff投影的全天图上同时呈现两套坐标系网格,关键在于通过坐标转换将其中一套的经纬线映射到另一套的投影空间里,再叠加绘制。下面是基于Matplotlib和Astropy的完整实现方案:
前置准备
首先安装Astropy(天文领域处理坐标转换的标准库):
pip install astropy
完整代码实现
import matplotlib.pyplot as plt import numpy as np from astropy.coordinates import SkyCoord import astropy.units as u # 1. 生成随机银道坐标样本(转换为度方便Astropy处理) l_deg = np.random.uniform(0, 360, 100) # 银道经度0-360度 b_deg = np.random.uniform(-90, 90, 100) # 银道纬度-90到90度 # 2. 银道坐标转赤道坐标(ICRS系统,Matplotlib Aitoff投影默认采用此系统) galactic_coords = SkyCoord(l=l_deg*u.degree, b=b_deg*u.degree, frame='galactic') equatorial_coords = galactic_coords.icrs ra_deg = equatorial_coords.ra.degree dec_deg = equatorial_coords.dec.degree # 3. 适配Aitoff投影的坐标格式:经度转为[-π, π]弧度 ra_rad = np.radians(ra_deg) ra_rad[ra_rad > np.pi] -= 2 * np.pi # 把大于180度的经度转为负角度 dec_rad = np.radians(dec_deg) # 4. 创建绘图对象 fig = plt.figure(figsize=(10, 6)) ax = plt.subplot(111, projection="aitoff") # 5. 绘制默认的赤道坐标系网格 ax.grid(True, linestyle='-', color='gray', alpha=0.7, label='Equatorial') # 6. 生成并绘制银道坐标系网格(转换为赤道坐标后绘制) # 绘制银道经度线(固定纬度,遍历经度) b_grid_lines = np.linspace(-90, 90, 7) # 每隔30度一条纬度线 for b in b_grid_lines: l_vals = np.linspace(0, 360, 360) # 遍历所有经度 gal_line = SkyCoord(l=l_vals*u.degree, b=b*u.degree, frame='galactic') eq_line = gal_line.icrs ra_line_rad = np.radians(eq_line.ra.degree) ra_line_rad[ra_line_rad > np.pi] -= 2 * np.pi dec_line_rad = np.radians(eq_line.dec.degree) ax.plot(ra_line_rad, dec_line_rad, color='darkorange', linestyle='--', alpha=0.6) # 绘制银道纬度线(固定经度,遍历纬度) l_grid_lines = np.linspace(0, 360, 13) # 每隔30度一条经度线 for l in l_grid_lines: b_vals = np.linspace(-90, 90, 180) # 遍历所有纬度 gal_line = SkyCoord(l=l*u.degree, b=b_vals*u.degree, frame='galactic') eq_line = gal_line.icrs ra_line_rad = np.radians(eq_line.ra.degree) ra_line_rad[ra_line_rad > np.pi] -= 2 * np.pi dec_line_rad = np.radians(eq_line.dec.degree) ax.plot(ra_line_rad, dec_line_rad, color='darkorange', linestyle='--', alpha=0.6) # 7. 绘制天文源散点 ax.scatter(ra_rad, dec_rad, s=15, color='darkblue', alpha=0.8, label='Astronomical Sources') # 8. 美化标签与布局 ax.set_xlabel('Right Ascension (°)') ax.set_ylabel('Declination (°)') # 调整经度刻度为更直观的度数格式 tick_labels = np.array([150, 120, 90, 60, 30, 0, 330, 300, 270, 240, 210]) ax.set_xticks(np.radians(-tick_labels)) ax.set_xticklabels(tick_labels) plt.title('Aitoff Projection with Dual Equatorial/Galactic Grids') plt.legend() plt.tight_layout() plt.show()
关键细节说明
- 坐标转换:用Astropy的
SkyCoord可以一键完成银道与赤道坐标的转换,避免手动计算天球坐标转换公式的繁琐与误差。 - 投影适配:Aitoff投影的经度范围是[-180°, 180°](对应[-π, π]弧度),所以需要将大于180°的经度值减去360°转为负角度。
- 网格区分:用灰色实线表示赤道网格,橙色虚线表示银道网格,避免视觉混淆。
- 灵活性:如果想要以银道投影为基础叠加赤道网格,只需将坐标转换方向反转,再用同样的方法绘制赤道经纬线即可。
内容的提问来源于stack exchange,提问作者Gabriel
相关产品推荐
相关产品推荐

