matplotlib 如何使用自定义的柱形图生成2D直方图?

zz2j4svz  于 2023-03-30  发布在  其他
关注(0)|答案(1)|浏览(145)

我是一名物理学家,研究超星系物体,我觉得很难根据我想要的制作2D直方图。
为了避免混淆和得到答案我已经知道。我将显示两个方法,我已经知道,然后我会提出定制斌,我想使用。
首先是一个hexbin的投影。

import numpy as np
import matplotlib.pyplot as plt

lat=2*np.pi*np.random.random(100000)-np.pi
lon=np.pi*np.random.random(100000)-np.pi/2

plt.subplot(111,projection="aitoff")
plt.title("Random Hex binning", fontsize = 20)
plt.hexbin(lat,lon,gridsize=(180,90))
ax=plt.gca()
plt.pause(0.1)
ax.set_xticklabels(ax.get_xticklabels()[::-1]) # Reverse axis
plt.xticks(fontsize=15)
plt.yticks(fontsize=15)
plt.xlabel("Lat",fontsize=18)
plt.ylabel("Lon",fontsize=18)
plt.colorbar()
plt.show()

当我运行这个时,我会得到这样的东西。

这可能是一个基本的2D直方图,我们可以在matplotlib手册中学习,但在天体物理学中,这并不是真正有用的,因为每个bin在球面曲面方面并不表示相同的区域。
我接下来学到的是使用Healpy库。

import healpy as hp
from healpy.newvisufunc import projview
import numpy as np
import matplotlib.pyplot as plt

nside=3 #nside is resolution
npix = hp.nside2npix(nside) #npix would be actual bins we will observe. npix = 12 * nside**2

lat=2*np.pi*np.random.random(1000)
lon=np.pi*np.random.random(1000)
indices=hp.ang2pix(nside,lon,lat)
hpmap=np.zeros(npix)
for i in indices:
    hpmap[i]=hpmap[i]+1
projview(
    hpmap,
    coord=["G"],
    graticule=True,
    graticule_labels=True,
    title="Random Binning with healpix",
    xlabel="lat",
    ylabel="lon",
    flip="astro",
    projection_type="mollweide",
)
plt.show()

现在我会得到一些像this

Healpix的优势在于我们可以看到球形弯曲的2D表面与2D平面投影的相等面积,但是,就个人而言,我不认为投影的形状是直接的,我不喜欢这样,我不知道如何分析这种分箱。

所以,这就是我想用我的装箱。我用我的基本微积分知识绘制了这个图,我甚至可以用plt.fill_between函数填充箱子。然而,我想要的是更多的,我实际上想根据我制作的这个自定义装箱制作2D直方图。我的意思是,仅仅使用plt.fill_between似乎很难控制HVC。我可以选择更好的主意吗?

mwyxok5s

mwyxok5s1#

我认为你应该尝试使用Nside更高的HEALPix贴图,这样像素的形状就不那么明显了。不确定它是否适用于你的应用程序,但你甚至可以平滑输出贴图以模糊bin之间的过渡。参见hp.smoothing

相关问题