2017-09-20 21 views
3

나는 아래의 멋진 hexbin plot을 가지고있다. 그러나 Aitoff 투영으로 hexbin을 얻는 방법이 있는지 궁금하다. 분출하는 코드는 다음과 같습니다matlotlib 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() 

나는 시도했다 : 만 좋은하지만, 빈, Aitoff 그리드를 제공

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

되는 plt.hexbin 명령을 수행하기 전에,하지만.

enter image description here

+0

어떤 투사의'hexbin' 플롯을 플롯의 문제가없는 준다 : 당신이 원하는 것을 얻기 위해 다음과 같이

당신은 당신의 코드를 변경할 수 있습니다. [mcve]가 없으면 아무도 문제가있는 곳을 알 수 없습니다. – ImportanceOfBeingErnest

+0

(잘하면) 최소한의 완전한 코드입니다. 위와 같이 RA/Decl 또는 x, y 데이터 포인트는 단지 numpy 배열 일 수 있습니다. – npross

+0

기본적으로 Aitoff 투영에 사용되는 hexbin을 찾을 수있는 예제가 없으므로 "투영법에서 hexbin 음모를 그리는 것만 큼 쉽지는 않다고 생각합니다." – npross

답변

4

문제는 에이 토프 도법이 -π에서 + π로, 라디안을 사용한다는 것입니다. 0도에서 360 도가 아닙니다. 저는 Angle.wrap_at 함수를 사용하여 this Astropy example (본질적으로 적절한 Aitoff 투영 플롯을 만드는 방법을 알려줍니다)을 수행합니다.

또한 축 제한을 변경할 수 없으므로 (오류로 이어질 수 있음) 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() 

원칙적으로 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

흠 ... 그래서 저는 예를 들어 코드를 얻을 수있다. 위의 그림을 작업하고 재현하는 것. 내가 할 수없는 일은 내 천체 표를 가져다가 현명한 것을 얻는 것이다. – npross

+0

위의 코드를 수정했습니다. 데이터는 여기에 있습니다 : https://www.dropbox.com/sh/4qsv753bhksn6ur/AAB4kthAcvmx_kQRa0zhkhQ0a?dl=0 – npross

+0

나는 천체가 없습니다. – ImportanceOfBeingErnest