如何在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()
关键说明
布尔掩码的逻辑:
- 使用
&连接多个条件,确保数据点同时满足RA在85.1-85.7之间、Dec在-2.5至-1.1之间。 - 注意Python中布尔运算要用
&(按位与)而非and,因为要对数组中的每个元素进行判断。
- 使用
数据筛选:
- 将掩码应用到原始数组上,直接得到筛选后的子数组,操作高效且无需重新下载数据。
CMD图优化:
- 添加
ax2.invert_yaxis()反转y轴,因为星等(phot_g_mean_mag)数值越小代表恒星越亮,反转后更符合天文学的常规展示习惯。
- 添加
内容的提问来源于stack exchange,提问作者Payton Bartz

