WCS作为使用astropy加载的数据立方体切片的matplotlib投影?

时间:2016-05-02 14:36:30

标签: python matplotlib astropy pyfits

我有一个名为'my_cube.fits'的FITS文件,带有WCS。该文件具有关于轴1和2(X和Y)的空间信息以及关于轴3(Z)的光谱信息。当我使用 astropy.io.fits 加载它时,光谱轴为0,空间轴为1和2.文件加载如下:

keydown

我一直在使用matplotlib来显示数据,我想知道如何使用其WCS显示我的数据立方体的单个光谱帧。让我们说:

    import astropy.io.fits as pyfits

    filename = 'my_cube.fits'
    my_data = pyfits.getdata(filename)
    my_header = pyfits.getheader(filename)

如果我这样做,我有:

    from astropy.wcs import WCS
    from matplotlib import pyplot as plt

    my_wcs = WCS(my_header)
    fig = plt.figure()
    ax = fig.add_subplot(111, projection=my_wcs)
    ax.imshow(my_data[5, :, :])

    plt.show()

2 个答案:

答案 0 :(得分:9)

您的WCS对象包含两个空间轴光谱轴,因为您使用完整标题初始化它(我假设您的标题还包含光谱WCS解决方案)。因此,仅使用空间创建2D绘图将不起作用,因为您对子绘图的投影是3D。

我自己没有这样做,也没有示例文件,但WCS文档提到您可以使用the sub function, or even the celestial functions获取单个轴或天体(空间)轴;这些函数将只返回那些轴的WCS对象。

因此,您可以使用以下内容:

my_wcs = WCS(my_header).celestial
fig = plt.figure()
ax = fig.add_subplot(111, projection=my_wcs)

答案 1 :(得分:4)

这是spectral-cube的一个很好的用例,可以有效地包装astropy.io.fits以供多维数据集使用。

如果安装了wcsaxes,Evert的解决方案一旦纠正就会有效。

为此使用spectral_cube,一个简单的例子是:

cube = SpectralCube.read(filename)
cube[5,:,:].quicklook() # uses aplpy

# using wcsaxes
fig = plt.figure()
ax = fig.add_axes([0.1,0.1,0.8,0.8], projection=cube[5,:,:].wcs)
ax.imshow(cube[5,:,:]) # you may need cube[5,:,:].value depending on mpl version