python - 使用 healpy 使用 HEALPix 像素化制作 2D 直方图
问题描述
数据是天空中物体的坐标,例如:
import pylab as plt
import numpy as np
l = np.random.uniform(-180, 180, 2000)
b = np.random.uniform(-90, 90, 2000)
我想做一个 2D 直方图,以便(l, b)
在 Mollweide 投影上使用 HEALPix 像素化绘制带有天空坐标的某个点的密度图。我怎样才能使用 healpy 做到这一点?
教程:
说如何绘制一维数组或拟合文件,但我不知道如何使用这种像素化来绘制二维直方图。
我也找到了这个功能,但它不起作用,所以我被卡住了。
hp.projaxes.MollweideAxes.hist2d(l, b, bins=10)
我可以通过这种方式在 Mollweide 投影中绘制这些点:
l_axis_name ='Latitude l (deg)'
b_axis_name = 'Longitude b (deg)'
fig = plt.figure(figsize=(12,9))
ax = fig.add_subplot(111, projection="mollweide")
ax.grid(True)
ax.scatter(np.array(l)*np.pi/180., np.array(b)*np.pi/180.)
plt.show()
非常感谢您的帮助。
解决方案
好问题!我编写了一个简短的函数来将目录转换为数字计数的 HEALPix 地图:
from astropy.coordinates import SkyCoord
import healpy as hp
import numpy as np
def cat2hpx(lon, lat, nside, radec=True):
"""
Convert a catalogue to a HEALPix map of number counts per resolution
element.
Parameters
----------
lon, lat : (ndarray, ndarray)
Coordinates of the sources in degree. If radec=True, assume input is in the icrs
coordinate system. Otherwise assume input is glon, glat
nside : int
HEALPix nside of the target map
radec : bool
Switch between R.A./Dec and glon/glat as input coordinate system.
Return
------
hpx_map : ndarray
HEALPix map of the catalogue number counts in Galactic coordinates
"""
npix = hp.nside2npix(nside)
if radec:
eq = SkyCoord(lon, lat, 'icrs', unit='deg')
l, b = eq.galactic.l.value, eq.galactic.b.value
else:
l, b = lon, lat
# conver to theta, phi
theta = np.radians(90. - b)
phi = np.radians(l)
# convert to HEALPix indices
indices = hp.ang2pix(nside, theta, phi)
idx, counts = np.unique(indices, return_counts=True)
# fill the fullsky map
hpx_map = np.zeros(npix, dtype=int)
hpx_map[idx] = counts
return hpx_map
然后,您可以使用它来填充 HEALPIx 地图:
l = np.random.uniform(-180, 180, 20000)
b = np.random.uniform(-90, 90, 20000)
hpx_map = hpx.cat2hpx(l, b, nside=32, radec=False)
在这里,nside
确定您的像素网格的精细或粗糙程度。
hp.mollview(np.log10(hpx_map+1))
另请注意,通过在银河纬度均匀采样,您会更喜欢银河两极的数据点。如果你想避免这种情况,你可以用余弦来缩小它。
hp.orthview(np.log10(hpx_map+1), rot=[0, 90])
hp.graticule(color='white')
推荐阅读
- c++ - 重载 [] 运算符的问题 (c++)
- visual-studio - 如何将 VS2019 更新到非最新版本?
- django - 在 Django 所需的 ModelAdmin 字段集中创建一个字段
- sql - 将数据从 csv 文件加载到表中时,如何在 BigQuery 中将 max_bad_records 设置为 100%?
- android - 使用 hilt 在@HiltWorker 中进行字段注入
- css - 使一个元素减去css中另一个元素的高度而不显示flex
- javascript - 无法加载,因为安装 Angular 时在此系统上禁用了运行脚本
- nginx - 如何使用 Openresty 和 Lua 动态创建上游块?
- amazon-kinesis - Kinesis 客户端库 (KCL) 显示“NoSuchFieldError”/“ClassNotFoundException”
- excel - 使用多个条件计算唯一值 - Excel