2017-09-20 12 views
3

私は下のnice hexbinプロットを持っていますが、Aitoffプロジェクションにhexbinを得る方法があるのでしょうか?matplotlib hexbinをAitoffプロジェクションに入れよう

import numpy as np 
import math 
import matplotlib.pyplot as plt 
from astropy.io import ascii 

filename = 'WISE_W4SNRge3_and_W4MPRO_lt_6.0_RADecl_nohdr.dat' 
datafile= path+filename 
data = ascii.read(datafile) 
points = np.array([data['ra'], data['dec']]) 

color_map = plt.cm.Spectral_r 
points = np.array([data['ra'], data['dec']]) 
xbnds = np.array([ 0.0,360.0]) 
ybnds = np.array([-90.0,90.0]) 
extent = [xbnds[0],xbnds[1],ybnds[0],ybnds[1]] 

fig = plt.figure(figsize=(6, 4)) 
ax = fig.add_subplot(111) 
x, y = points 
gsize = 45 
image = plt.hexbin(x,y,cmap=color_map, 
    gridsize=gsize,extent=extent,mincnt=1,bins='log') 

counts = image.get_array() 
ncnts = np.count_nonzero(np.power(10,counts)) 
verts = image.get_offsets() 

ax.set_xlim(xbnds) 
ax.set_ylim(ybnds) 
plt.xlabel('R.A.') 
plt.ylabel(r'Decl.') 
plt.grid(True) 
cb = plt.colorbar(image, spacing='uniform', extend='max') 
plt.show() 

と私が試した:顕著なコードがあるplt.hexbinコマンドを実行する前に

plt.subplot(111, projection="aitoff") 

を、だけで、素敵な、しかし空白Aitoffグリッドを与えます。

enter image description here

+0

を与えます。 [mcve]がなければ、誰もあなたの問題がどこにあるか知ることができません。 – ImportanceOfBeingErnest

+0

(うまくいけば)最小限の、完全なコードです。上記のように、RA/Declまたはx、yのデータポイントは、ちょうどnumpyの配列にすることができます。 – npross

+0

基本的には、Aitoff投影にhexbinが使われている例はありませんので、 "投影でhexbinプロットをプロットするのと同じくらい簡単ではないと思います..." – npross

答えて

4

問題がエイトフ図法は、-πから+πまでのラジアンを使用することです。 0度から360度ではありません。this Astropy example(これは本質的に適切なAitoff投影プロットを作成する方法を説明しています)に従って、これを達成するためにAngle.wrap_at関数を使用します。

さらに、軸の制限(エラーにつながる)を変更することはできません。また、extent(ImportanceOfBeingErnestの回答もあります)を使用しないでください。

次のようにあなたが望む結果を得るためにあなたのコードを変更することができます

import numpy as np 
import matplotlib.pyplot as plt 
from astropy.io import ascii 
from astropy.coordinates import SkyCoord 
from astropy import units 

filename = 'WISE_W4SNRge3_and_W4MPRO_lt_6.0_RADecl_nohdr.dat' 
data = ascii.read(filename) 
coords = SkyCoord(ra=data['ra'], dec=data['dec'], unit='degree') 
ra = coords.ra.wrap_at(180 * units.deg).radian 
dec = coords.dec.radian 

color_map = plt.cm.Spectral_r 
fig = plt.figure(figsize=(6, 4)) 
fig.add_subplot(111, projection='aitoff') 
image = plt.hexbin(ra, dec, cmap=color_map, 
        gridsize=45, mincnt=1, bins='log') 

plt.xlabel('R.A.') 
plt.ylabel('Decl.') 
plt.grid(True) 
plt.colorbar(image, spacing='uniform', extend='max') 
plt.show() 

任意の投影で `hexbin`プロットをプロットするのは問題ない原則で enter image description here

1

私はあなたの問題は、球面座標系の範囲以外に設定されてextentを使用することにあると思います。

以下が正常に動作します:

import matplotlib.pyplot as plt 
import numpy as np 

ra = np.linspace(-np.pi/2.,np.pi/2.,1000) 
dec = np.sin(ra)*np.pi/2./2. 
points = np.array([ra, dec]) 

plt.subplot(111, projection="aitoff") 

color_map = plt.cm.Spectral_r 
x, y = points 
gsize = 45 
image = plt.hexbin(x,y,cmap=color_map, 
        gridsize=45,mincnt=1,bins='log') 

plt.xlabel('R.A.') 
plt.ylabel(r'Decl.') 
plt.grid(True) 
cb = plt.colorbar(image, spacing='uniform', extend='max') 
plt.show() 

enter image description here

+0

Hmmm ....だから私あなたのコードを得ることができます上のプロットを作業して再現する。私ができないことは私のastropy.tableを取って、賢明なものを得ることです。 – npross

+0

上記のコードを修正しました。データはここにあります:: https://www.dropbox.com/sh/4qsv753bhksn6ur/AAB4kthAcvmx_kQRa0zhkhQ0a?dl=0 – npross

+0

私は、利用可能なastropyがありません。 – ImportanceOfBeingErnest

関連する問題