多次元データをスライスする

WCSAXは1次元または2次元データを描画することができる。もし我々のデータセットの次元が描画したいグラフよりも高ければ,グラフのx軸またはx軸とy軸のためにどの次元を選択しなければならない.この例は、FITSデータの立方体スライスをどのようにスライスし、そこから画像を描画するかを示す。

WCSオブジェクトをスライスする.

中で紹介した例と類似している 世界座標初期化軸を用いて 私たちは astropy.io.fits WCS情報を解析する.オリジナルFITSファイルは以下のアドレスからダウンロードできます here それがそうです。

import matplotlib.pyplot as plt
from astropy.wcs import WCS
from astropy.io import fits
from astropy.utils.data import get_pkg_data_filename
filename = get_pkg_data_filename('l1448/l1448_13co.fits')
hdu = fits.open(filename)[0]
wcs = WCS(hdu.header)
image_data = hdu.data

これは3次元データセットで、以下のようにタイトル情報を見ることができます。

>>> hdu.header  
...
NAXIS = 3 /number of axes
CTYPE1  = 'RA---SFL'           /
CTYPE2  = 'DEC--SFL'           /
CTYPE3  = 'VELO-LSR'           /
...

Headerキーワード‘NAXIS’はデータセットの次元数を与える.キーワード‘CTYPE 1’,‘CTYPE 2’,および‘CTYPE 3’は、それぞれこれらの次元のデータタイプを右上昇、右オフセット、および右速度とする。

そして私たちは実例化しました WCSAxes 使用 WCS オブジェクトを印刷し、印刷するスライスを選択します。

import matplotlib.pyplot as plt
ax = plt.subplot(projection=wcs, slices=(50, 'y', 'x'))

設定することで slices=(50, 'y', 'x') Y軸上に第2次元をプロットし,x軸上に第3次元を描画することを選択した.すべてのサイズを印刷していなくても、表示されていないサイズでどのスライスを選択するかを指定しなければなりません。本例では、最初のサイズは描画されていないため、表示するスライス50を選択した。選択されたスライスを変更し、印刷画像をどのように変更するかを見ることで、この操作を試みることができます。

画像を印刷する

そして,軸を画像に追加し,この方法を用いて描画する. imshow() それがそうです。

ax.coords[2].set_ticklabel(exclude_overlapping=True)
ax.imshow(image_data[:, :, 50].transpose())

(png, svg, pdf)

../../_images/slicing_datacubes-3.png

ここでは image_data ある種の ndarray 相手。Numpyでは、軸の順序が逆であるため、FITSファイルの最初のサイズが最後に表示され、最後のサイズが最初に表示され、以下同様である。したがって,インデックスは imshow() 伝えなければならない slices しかし順序が逆になった。また必要なのは transpose() image_data スライス中のxとy軸に描かれたサイズを反転させたからです

描画のサイズを反転させたくない場合は、以下の操作を行うだけでよい。

import matplotlib.pyplot as plt
ax = plt.subplot(projection=wcs, slices=(50, 'x', 'y'))
ax.imshow(image_data[:, :, 50])

(png, svg, pdf)

../../_images/slicing_datacubes-5.png

1次元データを描く

画素のスペクトル軸を描きたいのであれば、これを1次元にスライスすることで実現することができます。

import matplotlib.pyplot as plt
ax = plt.subplot(projection=wcs, slices=(50, 50, 'x'))

ここでは,第1次元と第2次元の50画素を選択し,第3次元をx軸として用いる.

We can now plot the spectral axis for this pixel. Note that we are plotting against pixel coordinates in the call to ax.plot, WCSAxes will display the world coordinates for us.

ax.plot(image_data[:, 50, 50])

なぜならこれはまだ WCSAxes 描画時には,x軸の表示単位を設定することができる.

ra, dec, vel = ax.coords
vel.set_format_unit(u.km/u.s)

(png, svg, pdf)

../../_images/slicing_datacubes-8.png

空間次元(すなわち画像中の1行の強度に沿って)に沿って1次元図を描きたければ WCSAxes デフォルトでは,この描画の2つの世界座標が表示される.色をカスタマイズし、空間軸ごとに格子線を追加することができます。

import matplotlib.pyplot as plt
ax = plt.subplot(projection=wcs, slices=(50, 'x', 0))
ax.plot(image_data[0, :, 50])

ra, dec, wave = ax.coords
ra.set_ticks(color="red")
ra.set_ticklabel(color="red")
ra.grid(color="red")

dec.set_ticks(color="blue")
dec.set_ticklabel(color="blue")
dec.grid(color="blue")

(png, svg, pdf)

../../_images/slicing_datacubes-10.png