2016-08-16 3 views
1

나는 128 개의 점으로 구성된 거친 skymap을 가지고 있는데, 그 중 smooth healpix map (첨부 된 그림 참조)을 만들고 싶습니다. 텍스트에서 참조 그림 : 내 데이터를로드보간 후의 Healpy 좌표 오차 : 이등분선의 등장

here

후 최종지도에 해당하는 픽셀 길이 (와 예를 들어, nside = 32)의 새로운 경도와 위도 배열을합니다.

내 입력 데이터는 :

lats = pi/2 + ths # theta from 0, pi, size 8 
lons = phs   # phi from 0, 2pi, size 16 
data = sky_data[0] # shape (8,16) 

뉴 경도/위도 배열 크기 nside의 픽셀 수에 따라 :

nside = 32 
pixIdx = hp.nside2npix(nside) # number of pixels I can get from this nside 
pixIdx = np.arange(pixIdx) # pixel index numbers 

그때 보간하여 그 픽셀을위한 새로운 데이터 값을 찾아 그런 다음 각도에서 픽셀로 다시 변환하십시오.

# new lon/lat 
new_lats = hp.pix2ang(nside, pixIdx)[0] # thetas I need to populate with interpolated theta values 
new_lons = hp.pix2ang(nside, pixIdx)[1] # phis, same 

# interpolation 
lut = RectSphereBivariateSpline(lats, lons, data, pole_values=4e-14) 
data_interp = lut.ev(new_lats.ravel(), new_lons.ravel()) #interpolate the data 
pix = hp.ang2pix(nside, new_lats, new_lons) # convert latitudes and longitudes back to pixels 

그럼, 보간 된 값을 사용하여지도를 생성 healpy :

healpix_map = np.zeros(hp.nside2npix(nside), dtype=np.double) # create empty map 
healpix_map[pix] = data_interp # assign pixels to new interpolated values 
testmap = hp.mollview(healpix_map) 

맵의 결과는 첨부 된 도면의 상부 RHS이다.

(제트의 사용 용서 - viridis 그래서 그 컬러 맵을 사용하여, 제로는 "흰색"을하지 않는 파란색 배경을 추가합니다.)

지도 잘 보이지 않는 : 당신이에서 볼 수 그림에서 거친지도는 낮은 RHS에 "핫스팟"이 있어야하지만 여기서는 왼쪽 상단에 나타납니다.

ax = plt.subplot(111, projection='astro mollweide') 
ax.grid() 
colors = data_interp 
sky=plt.scatter(new_lons, new_lats-pi/2, c = colors, edgecolors='none', cmap ='jet') 
plt.colorbar(sky, orientation = 'horizontal') 
) 전성 검사로서

는 난이지도처럼 보이게 마커의 에지를하게 제거 mollview 투영,도 2의 보간 점 산점도 있도록하기 matplotlib 사용

첨부 된 그림의 더 낮은 RHS 인이지도가 정확히 내가 원하는 것을 만들어 낸다는 것을 알 수 있습니다! 그래서 좌표는 괜찮습니다. 그리고 저는 완전히 혼란 스럽습니다.

이전에이 문제가 발생 했습니까? 내가 무엇을 할 수 있을지? 이 맵과 미래 맵에서 healpy 함수를 사용하고 싶습니다. 따라서 matplotlib를 사용하는 것은 옵션이 아닙니다.

감사합니다.

+0

문제를 재현하는 샘플 데이터 세트 ('sky_data')를 제공 할 수 있다면 직접 시도해 볼 수 있습니까? –

+0

안녕하세요 @ david-z, 저에게 다시 연락해 주셔서 감사합니다. 간단히하기 위해 필자는 ipython 노트북을 데이터와 함께 [public git repository] (https://github.com/ChiaraMingarelli/healpix_maps)에 추가했습니다. 놀이! –

답변

0

저는 (물리학자인 전 입자 물리학자인 적이 없습니다.) 실제로는 전례가 없었습니다. 그러나 나는 그것이 관습의 문제 일 뿐이라는 것을 알 수 있습니다. Mollweide 투영에서, 지도의 맨 아래에있는 북극 (양의 위도)입니다. 왜 그렇게 할 것인지, 아니면 이것이 의도적 인 행동인지는 모르겠지만, 그런 일이 벌어지고있는 것은 분명합니다. 적도 아래의 모든 항목을 가린 경우, 즉이 중심선 위의 데이터가없는 그래프와 함께 제공에만 긍정적 인 위도 포인트

mask = new_lats - pi/2 > 0 
pix = hp.ang2pix(nside, new_lats[mask], new_lons[mask]) 
healpix_map = np.zeros(hp.nside2npix(nside), dtype=np.double) 
healpix_map[pix] = data_interp[mask] 
testmap = hp.mollview(healpix_map) 

을 유지 :

masked plot from healpy

적어도 그것을 고칠 수있을만큼 간단합니다. mollviewrot 매개 변수가 영사되기 전에보기 축을 기준으로 효과적으로 회전하게하고 flip 매개 변수는 'astro' (기본값) 또는 'geo'으로 설정하여 east가 왼쪽 또는 오른쪽에 표시되는지 여부를 설정할 수 있습니다. 약간의 실험 당신이 튜플에서

hp.mollview(healpix_map, rot=(180, 0, 180), flip='geo') 

당신이 원하는 좌표계를 얻을 수 있음을 보여주고, 처음 두 요소는 플롯의 중심에 설정하는 지점의 위도와 경도, 그리고 세 번째 요소는있다 회전. 모두도 단위입니다. 어떤 마스크가이 제공 : 나는 당신이 찾고있는 단지 무엇을 생각

unmasked rotated image

.

+0

Thanks @ David-z, 실제로 컨벤션 문제 였지만이 제안 된 수정은 정확한 답을주지 못했습니다 (위의 해답을 참조하십시오). –

+0

아, 미안 해요. 나는 너무 피곤했다. 글쎄, 당신은 스스로 발견했기 때문에 내 해결책이 필요 없다.하지만 나는 내 대답을 수정하기 위해 업데이트 할 것이다. –

+0

@ David-z를 도와 주셔서 감사합니다. 다시 한번 감사드립니다. –

1

나는 그것을 알아 냈다 - 나는 보간이 일을 제대로 렌더링하는 이미지에 대해 다음 변환을 적용 할 필요가 그래서 결국 내 쎄타에 PI/2를 추가했다 :

newnew_lats = pi - new_lats 
newnew_lons = pi + new_lons 

보이기는 그렇게 보이지 않지만 보간법에는 여전히 약간의 문제가있는 것으로 보입니다. 나는 다른 것을 시도해 볼 수도 있습니다.