Healpy plotting:如何使用healpy.mollview投影制作包含子图的图形?

时间:2016-06-15 19:31:41

标签: axes healpy

我刚刚开始尝试使用healpy而且我无法弄清楚如何制作包含我的地图的子图。我有一个行星的热发射图作为时间的函数,我需要在几个时刻(比如9个不同的时间)查看它并叠加一些坐标,以检查我的行星正在以正确的方向旋转。

到目前为止,我可以做两件事。

  1. 使用叠加坐标制作9个不同的数字。
  2. 制作一个包含9个不同地图的9个子图,但是我的所有坐标都叠加在我的所有子图上,而不仅仅是适合时间的地图。
  3. 我不确定这是否是一个非常简单的问题,但它让我发疯,我找不到任何有用的东西。

    我会告诉你我的意思:

    选项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

    我知道我需要一种方法来调用具有time = t map的轴并在适当的地图上绘制时间= t的星星,但到目前为止我所尝试的一切都失败了。我主要尝试使用projaxes,因为我可以定义matplotlib轴并在其上绘制星星,但它不起作用。有什么建议?

    另外,我想在我的地图上绘制一些线条,但我也无法弄清楚如何做到这一点。文件说projplot但如果我不告诉它我想要一个标记,它就不会画任何东西。

    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)
    

    所以这应该给我每个帧一颗星,这个星应该是移动的。但相反,它会在所有帧上绘制所有星星。

    我该怎么办?我不太了解文档。

2 个答案:

答案 0 :(得分:0)

我刚刚遇到这个问题寻找同一问题的解决方案,但设法从mollview(here)的文档中找到它。

正如您在那里注意到的那样,他们说'sub'接受与函数子图相同的语法(来自matplotlib)。这种格式是:

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

E.g。为了制作你的情节,每个迭代中想要接收的值是

sub=(3,3,i) 

我从1到9(3 * 3)。

这对我有用,我没有尝试使用你的代码,但是应该可以工作。

希望这有帮助!

答案 1 :(得分: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