许峰玮
如何使用Matplotlib.axes绘制DS9定义的Regions对象
2022-7-11 17:27
阅读:1586

2009横空出世的APLpy(全称Astronomical Plotting Library in Python,https://aplpy.readthedocs.io/en/stable/)无疑通过其强大的集成成功博取了一大波天文学者的欢心,而其英文的谐音Apple Pie(苹果派)也深入人心。APLpy通过对于Astropy中的WCSAxes、以及大量Matplotlib基础功能,集合一系列Python基础包例如Astropy子包astropy.units, astropy.coordinates, Numpy等,最终用于产出了一款高度集成、用户友好的图像绘制包。现在打开大量观测相关的文献,使用APLpy绘制出来的图片比比皆是。

APLpy能够快速爆火其中一个原因就是其与DS9(另一款常用天文图像预览软件,https://sites.google.com/cfa.harvard.edu/saoimageds9)的梦幻联动。通过使用

import aplpy
aplpy.FITSFigure.show_regions('my_region_name.reg')

可以十分方便的展示DS9中定义的区域my_region_name.reg。这种方法看似平平无奇,实则能够大大减轻图片标注、绘制标识的任务。并且可以有很高级的用法,这个留给读者慢慢摸索,笔者在后续也会展示一系列使用show_regions这个功能的高级玩法,敬请期待。

总而言之,看上去APLpy已经要主导天文图像的绘制,但是APLpy的优点正是它自身的劣势,过于集成的功能会导致一些自定义非常困难,Matplotlib自带的高度自由化的绘制功能被很大程度削尖了。那么Matplotlib有哪些高级的玩法是APLpy缺失的呢,我们也会开一版专门讲讲关于colorbar的绘制以及多张子图之间的联动、共同展示。

本期旨在告诉大家,不使用APLpy也能够绘制DS9的regions对象。其意义在于,当你不得不使用Matplotlib绘制一些APLpy无法绘制的图像时,不要被无法展示DS9图片绊住了“马腿”。

def show_regions(ax,region_fn,hdr,iftext=False):
    reg_name = region_fn
    r = pyregion.open(reg_name).as_imagecoord(header=hdr)
    patch_list, artist_list = r.get_mpl_patches_texts()
    for p in patch_list:
        new_p=copy(p)
        ax.add_patch(new_p)
    if iftext:
        for p in artist_list:
            new_p=copy(p)
            ax.add_artist(new_p)

此函数读取"region_fn"(DS9定义的region文件路径),通过投影在图片的header文件定义的天球坐标上,绘制在Matplotlib.axes上。

注意,region_fn一般有两种类型的对象,一种称为patches,即circle,rectangle,arrow等这类图像;另一种则称为artist,即一般是文字等对象,因此iftext如果改为True,即将artist也一并绘制。因为本绘制需要ax参数,因此请提前定义一个天球坐标投影的axes:

from astropy.wcs import WCS
from astropy.io import fits 

hdr = fits.getheader(your_fits_name)
w = WCS(hdr)
ax1 = fig.add_axes([0.0,0.1,0.25,0.8],projection=w.celestial)

show_regions(ax1,your_region_name,hdr,)

转载本文请联系原作者获取授权,同时请注明本文来自许峰玮科学网博客。

链接地址:https://wap.sciencenet.cn/blog-3420944-1346847.html?mobile=1

收藏

分享到:

当前推荐数:0
推荐到博客首页
网友评论0 条评论
确定删除指定的回复吗?
确定删除本博文吗?