2016-06-15 13 views
1

Я только недавно начал пытаться использовать healpy, и я не могу понять, как заставить подзаголовки содержать мои карты. У меня есть карта теплового излучения планеты как функция времени, и мне нужно смотреть на нее в несколько моментов времени (скажем, 9 раз) и накладывать некоторые координаты, чтобы проверить, что моя планета вращается правильно.Healpy plotting: Как сделать фигуру с подзаголовками, используя проекцию healpy.mollview?

До сих пор я могу сделать 2 вещи.

  1. Сделайте 9 разных фигур с наложенными координатами.
  2. Сделайте цифру с 9 подзаголовками, содержащими 9 разных карт, но накладывающую все мои координаты на все мои подзадачи, а не только соответствующие времени.

Я не уверен, что это очень простая проблема, но это сводит меня с ума, и я не могу найти что-нибудь, что работает.

Я покажу вам, что я имею в виду:

ВАРИАНТ 1:

import healpy as hp 
import matplolib.pyplot as plt 





MAX = 10**(23) 
MIN = 10**10 

for i in range(9): 
    t = 4000+10*i 

    hp.visufunc.mollview(Fmap_wvpix[t,:], 
         title = "Map at t="+str(t), min = MIN, max=MAX)) 

    hp.visufunc.projplot(d[t,np.where(np.abs(d[t,:,2]-SSP[t])<0.5),1 ], 
         d[t,np.where(np.abs(d[t,:,2]-SSP[t])<0.5),2], 
         'k*',markersize = 6) 

    hp.visufunc.projplot(d[t,np.where(np.abs(d[t,:,2]-(SOP[t]))<0.2),1 ], 
         d[t,np.where(np.abs(d[t,:,2]-(SOP[t]))<0.2),2], 
         'r*',markersize = 6) 

Это делает 9 цифр, которые выглядят довольно много, как это:

Flux map superimposed with some stars at time = t

Но мне нужно многие из них, поэтому я хочу сделать изображение, которое содержит 9 подзаговоров, которые выглядят как изображение.

ВАРИАНТ 2:

fig = plt.figure(figsize = (10,8)) 

for i in range(9): 
    t = 4000+10*i 

    hp.visufunc.mollview(Fmap_wvpix[t,:], 
         title = "Map at t="+str(t), min = MIN, max=MAX, 
         sub = int('33'+str(i+1))) 


    hp.visufunc.projplot(d[t,np.where(np.abs(d[t,:,2]-SSP[t])<0.5),1 ], 
         d[t,np.where(np.abs(d[t,:,2]-SSP[t])<0.5),2], 
         'k*',markersize = 6) 

    hp.visufunc.projplot(d[t,np.where(np.abs(d[t,:,2]-(SOP[t]))<0.2),1 ], 
         d[t,np.where(np.abs(d[t,:,2]-(SOP[t]))<0.2),2], 
         'r*',markersize = 6) 

Это дает мне делянки, но он привлекает все projplot звезды на все мой сюжетных! (См изображения)

Subplots with too many stars

Я знаю, что я нужен способ вызова осей, что имеет время = т карту и рисовать звезды времени = т на соответствующей карте, но все, что я имею до сих пор не удалось. Я в основном пытался использовать projaxes, думая, что могу определить оси matplotlib и нарисовать на нем звезды, но он не работает. Любой совет?

Кроме того, я хотел бы нарисовать некоторые строки на моей карте, но я не могу понять, как это сделать. Документация говорит projplot, но он не будет рисовать anyting, если я не говорю, что я хочу маркер.

PS: Этот код, вероятно, бесполезен для вас, так как он не будет работать, если у вас нет моих массивов. Вот более простой вариант, который должен работать:

import numpy as np 
import healpy as hp 
import matplotlib.pyplot as plt 


NSIDE = 8 
m = np.arange(hp.nside2npix(NSIDE))*1 


MAX = 900 
MIN = 0 


fig = plt.figure(figsize = (10,8)) 
for i in range(9): 
    t = 4000+10*i 

    hp.visufunc.mollview(m+100*i, title = "Map at t="+str(t), min = MIN, max=MAX, 
         sub = int('33'+str(i+1))) 

    hp.visufunc.projplot(1.5,0+30*i, 'k*',markersize = 16) 

Так это должно дать мне одну звезду для каждого кадра и звезда должна двигаться. Но вместо этого он рисует все звезды на всех кадрах.

Что я могу сделать? Я не понимаю документацию.

ответ

0

Я только столкнулся с этим вопросом в поиске решения той же проблемы, но смог найти его из документации mollview (here).

Как вы заметили, они говорят, что «под» получил тот же синтаксис, что и функция subplot (от matplotlib). Этот формат:

(# of rows, # of columns, # of current subplot) 

E.g. чтобы сделать свой участок, стоимость суб хочет получить в каждой итерации

sub=(3,3,i) 

Где я пробегает значения от 1 до 9 (3 * 3).

Это сработало для меня, я не пробовал это с вашим кодом, но должен работать.

Надеюсь, это поможет!

0

Если вы хотите иметь healpy участков в matplotlib подзаголовках, следующий путь был бы таким. Ключ должен использовать plt.axes() для выбора активного подзаголовка и использовать ключевое слово hold=True в функциях healpy.

import healpy as hp 
import numpy as np 
import matplotlib.pyplot as plt 

fig, (ax1, ax2) = plt.subplots(ncols=2) 

plt.axes(ax1) 
hp.mollview(np.random.random(hp.nside2npix(32)), hold=True) 

plt.axes(ax2) 
hp.mollview(np.arange(hp.nside2npix(32)), hold=True) 

enter image description here