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

如何在Python中按指定RA/Dec范围绘制GAIA VOTable数据?

问题描述

我有一个来自GAIA的VOTable文件,包含约47000个数据点。目前已能使用astropy.io.votable解析该表,读取ra、dec、parallax、phot_g_mean_mag、g_rp等指定列的数值,也能绘制包含所有点的图表。现在希望筛选出**RA(85.1至85.7)和Dec(-2.5至-1.1)**范围内的数据点,仅绘制这些点的CMD(星等-颜色图)。

当前读取全量数据的代码如下:

from astropy.io.votable import parse
import matplotlib.pyplot as plt
from astropy.io.votable import parse_single_table

table = parse_single_table("votables/star.vot")
ra = table.array['ra']
dec = table.array['dec']
gmag = table.array['phot_g_mean_mag']
parallax = table.array['parallax']
g_rp = table.array['g_rp']

fig, (ax1, ax2) = plt.subplots(2)
im1 = ax1.scatter(dec, ra, s=0.2, c=parallax, cmap='gray')
im2 = ax2.scatter(g_rp, gmag, s=0.4, c=parallax, cmap='gray')
plt.show()

我目前只能通过重新进行GAIA搜索获取指定范围数据,但这种方法低效且繁琐。由于使用Python 3.6,无法借助astroquery简化搜索流程。请问是否可以直接从全表中筛选指定RA和Dec范围的数据,并提取对应的gmag、parallax、g_rp等数值进行绘图?

补充:以下是可用于生成类似.vot文件的ADQL示例(中文翻译版):

SELECT TOP 2000
gaia_source.source_id,gaia_source.ra,gaia_source.dec,gaia_source.parallax,gaia_source.pmra,gaia_source.pmdec,gaia_source.ruwe,gaia_source.phot_g_mean_mag,gaia_source.bp_rp,gaia_source.g_rp,gaia_source.radial_velocity,gaia_source.phot_variable_flag,gaia_source.non_single_star,gaia_source.has_xp_continuous,gaia_source.has_xp_sampled,gaia_source.has_rvs,gaia_source.has_epoch_photometry,gaia_source.has_epoch_rv,gaia_source.has_mcmc_gspphot,gaia_source.has_mcmc_msc,gaia_source.teff_gspphot,gaia_source.logg_gspphot,gaia_source.mh_gspphot,gaia_source.distance_gspphot,gaia_source.azero_gspphot,gaia_source.ag_gspphot,gaia_source.ebpminrp_gspphot
FROM gaiadr3.gaia_source
WHERE
CONTAINS(
POINT('ICRS',gaiadr3.gaia_source.ra,gaiadr3.gaia_source.dec),
CIRCLE(
'ICRS',
COORD1(EPOCH_PROP_POS(84.68652242855,-2.60007866108,3.0400,4.6000,-.4000,29.9000,2000,2016.0)),
COORD2(EPOCH_PROP_POS(84.68652242855,-2.60007866108,3.0400,4.6000,-.4000,29.9000,2000,2016.0)),
0.5)
)=1
AND (gaiadr3.gaia_source.parallax BETWEEN 1 AND 2
AND gaiadr3.gaia_source.g_rp<=2000
AND gaiadr3.gaia_source.phot_g_mean_mag>=14)

解决方案

完全可以直接从本地VOTable文件中筛选数据,无需重新搜索。核心思路是创建布尔掩码,筛选出符合RA和Dec范围的数据点,再用掩码提取对应列的数值进行绘图。

修改后的代码

from astropy.io.votable import parse_single_table
import matplotlib.pyplot as plt

# 读取VOTable表
table = parse_single_table("votables/star.vot")

# 提取原始数据列
ra = table.array['ra']
dec = table.array['dec']
gmag = table.array['phot_g_mean_mag']
parallax = table.array['parallax']
g_rp = table.array['g_rp']

# 创建筛选掩码:同时满足RA和Dec的范围条件
mask = (ra >= 85.1) & (ra <= 85.7) & (dec >= -2.5) & (dec <= -1.1)

# 用掩码筛选数据
filtered_gmag = gmag[mask]
filtered_parallax = parallax[mask]
filtered_g_rp = g_rp[mask]
filtered_ra = ra[mask]
filtered_dec = dec[mask]

# 绘制图表:仅展示筛选后的点
fig, (ax1, ax2) = plt.subplots(2)
# 左上角的位置分布散点图(可选,仅展示筛选区域)
im1 = ax1.scatter(filtered_dec, filtered_ra, s=0.2, c=filtered_parallax, cmap='gray')
# 右下角的CMD图
im2 = ax2.scatter(filtered_g_rp, filtered_gmag, s=0.4, c=filtered_parallax, cmap='gray')
# 调整CMD图的星等轴:通常星等数值越小越亮,反转y轴更符合习惯
ax2.invert_yaxis()

# 添加颜色条(可选,展示视差的对应关系)
fig.colorbar(im2, ax=ax2, label='Parallax (mas)')

plt.tight_layout()
plt.show()

关键说明

  1. 布尔掩码的逻辑:

    • 使用&连接多个条件,确保数据点同时满足RA在85.1-85.7之间、Dec在-2.5至-1.1之间。
    • 注意Python中布尔运算要用&(按位与)而非and,因为要对数组中的每个元素进行判断。
  2. 数据筛选:

    • 将掩码应用到原始数组上,直接得到筛选后的子数组,操作高效且无需重新下载数据。
  3. CMD图优化:

    • 添加ax2.invert_yaxis()反转y轴,因为星等(phot_g_mean_mag)数值越小代表恒星越亮,反转后更符合天文学的常规展示习惯。

内容的提问来源于stack exchange,提问作者Payton Bartz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 15:40:38