在整个天空的网格上绘制FITS图像

时间:2019-02-15 10:54:47

标签: python python-3.x matplotlib astropy

我想在整个天空的草图上绘制FITS图像。

我在绘制整个天空方面走得很远:

import matplotlib.pyplot as plt
from astropy.utils.data import get_pkg_data_filename
from astropy.io import fits

image_file = get_pkg_data_filename('tutorials/FITS-images/HorseHead.fits')
image_data = fits.getdata(image_file, ext=0)

plt.subplot(111, projection='aitoff')
plt.grid(True)
plt.imshow(image_data, cmap='gray')
plt.show()

但是我似乎无法使FITS图像与网格正确对齐


上面的代码导致以下结果 actual result 但我正在尝试获得更多类似的东西 expected result 其中蓝色正方形是图像在image_file

中的实际位置

1 个答案:

答案 0 :(得分:3)

image_data只是像素值的数组,实际上不包含有关天空地图上像素位置和方向的任何信息。您也必须从FITS文件中提取该信息。

一个例子是(基于herehere的信息):

import matplotlib.pyplot as plt
from astropy.utils.data import get_pkg_data_filename
from astropy.io import fits
from astropy.wcs import WCS
from astropy.visualization.wcsaxes.frame import EllipticalFrame

image_file = get_pkg_data_filename('tutorials/FITS-images/HorseHead.fits')
image_header = fits.open(image_file)[0].header  # extract header info
image_data = fits.getdata(image_file, ext=0)

# use the WCS class to get coordinate info and projection axes to use
wcs = WCS(image_header)

# make the axes using the EllipticalFrame class
ax = plt.subplot(projection=wcs, frame_class=EllipticalFrame)

# add the image
im = ax.imshow(image_data, origin='lower')

# add a grid
overlay = ax.get_coords_overlay('fk5')
overlay.grid(color='white', ls='dotted')

plot of horsehead nebula

由于特定的图像示例不会在整个天空中延伸,因此您只会看到一个小补丁(但是您可以根据需要使用ax.set_xlim()ax.set_ylim()扩展图不确定这些单位是什么,也值得注意的是,该图像实际上仅覆盖了很小的一片天空),但是如果您的图像在整个天空上,则看起来像是here所示的Aitoff投影。

我认为这仅适用于最新版本的astropy(v3.1),Matplotlib(v3.0.2),因此需要Python> = 3.5。

您可能还想看看healpy,尽管在笨拙的示例FITS文件中无法读取。