【问题标题】:Healpy plotting: How do i make a figure with subplots using the healpy.mollview projection?Healpy 绘图:如何使用 healpy.mollview 投影制作带有子图的图形?
【发布时间】:2016-10-17 02:05:35
【问题描述】:

我最近才开始尝试使用healpy,但我不知道如何制作子图来包含我的地图。我有一个行星的热发射图作为时间的函数,我需要在几个时间点(比如说 9 个不同的时间)查看它并叠加一些坐标,以检查我的行星是否以正确的方式旋转。

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

  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

我知道我需要一种方法来调用具有 time = t 映射的轴并在适当的地图上绘制 time = 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)

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

我能做什么?我看不懂文档。

【问题讨论】:

    标签: axes healpy


    【解决方案1】:

    如果您想在matplotlib 子图中拥有healpy 地块,则可以采用以下方法。关键是使用plt.axes() 选择活动子图并在healpy 函数中使用hold=True 关键字。

    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)
    

    【讨论】:

    • 很抱歉没有信息的评论,但我必须登录才能更新。谢谢。
    【解决方案2】:

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

    正如您在此处注意到的,他们说“sub”接收到与函数 subplot(来自 matplotlib)相同的语法。这种格式是:

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

    例如为了制作你的情节, sub 希望在每次迭代中收到的值是

    sub=(3,3,i) 
    

    我从 1 运行到 9 (3*3)。

    这对我有用,我没有用你的代码尝试过,但应该可以。

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-10
      • 1970-01-01
      • 1970-01-01
      • 2022-11-17
      • 1970-01-01
      • 2016-04-10
      • 1970-01-01
      • 2014-08-22
      相关资源
      最近更新 更多