首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Healpy绘图:如何使用healpy.mollview投影生成带有子图的图形?

Healpy绘图:如何使用healpy.mollview投影生成带有子图的图形?
EN

Stack Overflow用户
提问于 2016-06-15 19:31:41
回答 2查看 3.4K关注 0票数 3

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

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

  1. 用叠加的坐标制作9个不同的数字。
  2. 用包含9幅不同地图的9个子图制作一个图形,但这会将我所有的坐标叠加在我的所有子图上,而不仅仅是与时间相关的坐标。

我不知道这是否是一个非常简单的问题,但它一直让我发疯,我找不到任何可行的东西。

我来告诉你我的意思:

备选案文1:

代码语言:javascript
复制
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个数字看起来很像这样:

时间上与某些恒星叠加的通量图

但我需要很多,所以我想要做一个图像,其中包含9个子图,看上去像图像。

备选案文2:

代码语言:javascript
复制
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)

这给了我副图,但它在我所有的子图上画出了所有的轨迹星!(见下图)

有太多星星的子情节

我知道我需要一种方法来调用具有时间=t地图的轴,并在适当的地图上绘制时间的星星,但我迄今尝试过的一切都失败了。我主要尝试使用projaxes,认为我可以定义一个matplotlib轴,并在上面画星星,但是它不起作用。有什么建议吗?

另外,我也想在我的地图上画一些线,但我也想不出怎么做。文档上写着序言,但是如果我不告诉它我想要一个标记,它就不会画任何东西。

PS:这段代码对你来说可能没用,因为如果你没有我的数组,它就不能工作了。下面是一个应该运行的更简单的版本:

代码语言:javascript
复制
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)

因此,这应该给我每一帧一颗恒星,这颗星应该在移动。相反,它把所有的星星都画在了所有的框架上。

我能做什么?我不明白这些文件。

EN

回答 2

Stack Overflow用户

发布于 2017-10-22 04:02:24

如果您希望在healpy子图中使用matplotlib绘图,那么下面的方法是可行的。关键是使用plt.axes()选择active子图,并在healpy函数中使用hold=True关键字。

代码语言:javascript
复制
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)

票数 4
EN

Stack Overflow用户

发布于 2017-01-20 16:36:49

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

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

代码语言:javascript
复制
( # of rows, # of columns, # of current subplot)

例如,为了制作您的绘图,子程序希望在每次迭代中接收的值是

代码语言:javascript
复制
sub=(3,3,i) 

从1到9 (3*3)。

这对我有用,我还没有用你的代码试过这个,但是应该能工作。

希望这能有所帮助!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37844221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档