我最近刚刚开始尝试使用healpy,但我不知道如何制作子图来包含我的地图。我有一个行星随时间变化的热发射图,我需要在几个时刻(假设 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 个人物看起来非常像这样:
但我需要很多,所以我想制作一个包含 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 星星! (见下图)
我知道我需要一种方法来调用具有时间 = t 地图的轴,并在适当的地图上绘制时间 = 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)
所以这应该为每一帧给我一颗星星,并且星星应该是移动的。但相反,它在所有框架上绘制了所有星星。
我能做什么?我看不懂文档。
如果您想在
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)
我刚刚遇到这个问题,正在寻找同一问题的解决方案,但设法从 mollview 的文档中找到它(here)。
正如您所注意到的,他们说“sub”接收了与函数 subplot (来自 matplotlib)相同的语法。这种格式是:
( # of rows, # of columns, # of current subplot)
例如为了制作你的图, sub 希望在每次迭代中接收的值是
sub=(3,3,i)
我从 1 跑到 9 (3*3)。
这对我有用,我还没有用你的代码尝试过这个,但应该可以。
希望这有帮助!
我正在寻找同一问题的答案,但是当使用 Daniel Lenz 的建议时,两个子图最终具有不同的大小。对我来说,解决方案是使用
gridspec_kw={'height_ratios': [1, 1]}
,如下面的代码所示:
import matplotlib.pyplot as plt
import numpy as np
import healpy as hp
nside = 2**6
npix = hp.nside2npix(nside)
# Create a figure with two subplots
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 8), gridspec_kw={'height_ratios': [1, 1]})
plt.axes(ax1)
hp.mollview(np.random.random(hp.nside2npix(32)), min=0, max=10, hold=True)
plt.axes(ax2)
hp.mollview(np.random.random(hp.nside2npix(32)), min=0, max=10, hold=True)
# Adjust layout
plt.tight_layout()
# Show the plot
plt.show()