2016-05-02 17 views
4

WCSに「my_cube.fits」という名前のFITSファイルがあります。このファイルには、軸1と軸2(XとY)の空間情報と軸3(Z)のスペクトル情報があります。私はastropy.io.fitsを使用して、それをロードすると、スペクトル軸が0であると空間軸は、1と2のファイルは次のようにロードされているものがあります。astropyを使用してロードされたデータキューブスライスのmatplotlib投影としてのWCS?

import astropy.io.fits as pyfits 

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

私は、データとIを表示するには、matplotlibのを使用していますWCSを使用して自分のデータキューブの単一のスペクトルフレームを表示する方法を知りたいさんが言ってみましょう:

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() 

私はちょうど、私が持っていることを行う場合:あなたは完全なヘッダーでそれを初期化するので

... 
    File "/usr/local/lib/python3.4/dist-packages/matplotlib/figure.py", line 1005, in add_subplot 
    a = subplot_class_factory(projection_class)(self, *args, **kwargs) 
    File "/usr/local/lib/python3.4/dist-packages/matplotlib/axes/_subplots.py", line 73, in __init__ 
    self._axes_class.__init__(self, fig, self.figbox, **kwargs) 
    File "/usr/local/lib/python3.4/dist-packages/wcsaxes/core.py", line 49, in __init__ 
    self.patch = self.coords.frame.patch 
    File "/usr/local/lib/python3.4/dist-packages/wcsaxes/frame.py", line 129, in patch 
    self._update_patch_path() 
    File "/usr/local/lib/python3.4/dist-packages/wcsaxes/frame.py", line 115, in _update_patch_path 
    self.update_spines() 
    File "/usr/local/lib/python3.4/dist-packages/wcsaxes/frame.py", line 192, in update_spines 
    self['b'].data = np.array(([xmin, ymin], [xmax, ymin])) 
    File "/usr/local/lib/python3.4/dist-packages/wcsaxes/frame.py", line 40, in data 
    self._world = self.transform.transform(self._data) 
    File "/usr/local/lib/python3.4/dist-packages/wcsaxes/transforms.py", line 166, in transform 
    world = self.wcs.wcs_pix2world(pixel_full, 1) 
    File "/usr/local/lib/python3.4/dist-packages/astropy/wcs/wcs.py", line 1329, in wcs_pix2world 
'output', *args, **kwargs) 
    File "/usr/local/lib/python3.4/dist-packages/astropy/wcs/wcs.py", line 1231, in _array_converter 
    return _return_single_array(xy, origin) 
    File "/usr/local/lib/python3.4/dist-packages/astropy/wcs/wcs.py", line 1212, in _return_single_array 
"of shape (N, {0})".format(self.naxis)) 
    ValueError: When providing two arguments, the array must be of shape (N, 3) 

答えて

6

あなたのWCSのオブジェクトは、(、2つの空間軸スペクトル軸が含まれていますあなたのヘッダーにもスペクトルWCSソリューションが含まれていると仮定します)。したがって、サブプロットに与えられた投影が3Dであるため、空間だけで2Dプロットを作成することはできません。

私はこれをやっていませんし、サンプルファイルもありませんが、the sub function, or even the celestial functionsを使って個々の軸または天体(空間)軸を取得することができることをWCSのドキュメントで述べています。これらの関数は、それらの軸だけを持つWCSオブジェクトを返します。

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

'celestial'は、プロパティ、関数ではなく、それは、ドキュメント内の修正が必要になります – keflavich

+0

を呼び出す必要はありません。その後、 APIのドキュメントは正しいですが、私がリンクしている部分はそれを関数と呼びます。 – Evert

4

これが効果的にキューブの用途にastropy.io.fitsをラップspectral-cubeのために良いユースケース、次のとおりです。

したがって、あなたはおそらく次のように使用することができます。

修正されたEvertのソリューションは、wcsaxesがインストールされていると仮定して動作します。このため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