Boxcar在python / astropy中卷积散点图?

我相信对此的修复将相对简单,但我似乎无法弄清楚如何卷积我在 python中绘制的散点图.

我有2个数据阵列,一个银河系纬度和一个星系经度,我用锤子投影绘制它们来表示星系坐标中的恒星分布.

现在,我想使用boxcar平滑来平滑15度盒子的情节.
我尝试过使用带有convolve和Box2DKernel的astropy.convolution,但我似乎无法使其工作.
我也看过http://docs.astropy.org/en/stable/convolution/kernels.html的例子
但我不明白如何将他们的例子翻译成我需要做的事情.他们似乎正在绘制2D功能并平滑它.我可以不对一个情节进行卷积并按照它们在图表上的位置来分组吗?我唯一能展示的东西会产生一条直线,我不明白为什么.我对python很新,所以这给我带来了很多麻烦.

这是我到目前为止的代码:

这将两个阵列绘制成锤子投影:

from astropy import units as u
import astropy.coordinates as coord
glat = coord.Angle(pos_data['GLAT']*u.degree)
glon = coord.Angle(pos_data['GLON']*u.degree)
glon= glon.wrap_at(180*u.degree)

import matplotlib.pyplot as plt
fig = plt.figure(figsize=(10,12))
ax = fig.add_subplot(211, projection="hammer")
ax.scatter(glon.radian, glat.radian)
ax.grid(True)

这是我尝试卷积数据:

from astropy.convolution import convolve, Box2DKernel
data = [glon, glat]
kernel = Box2DKernel(10)
smoothed = convolve(data, kernel)

ax = fig.add_subplot(212, projection="hammer")
ax.scatter(smoothed[0]*u.radian, smoothed[1]*u.radian)
ax.grid(True)

就像我说的那样,这只是众多尝试中的一种,最终会给出一些东西而不是错误,但我不确定我是否正确使用该功能.我不确定(或者我不认为)我可以按照我的方式创建“数据”,但是任何其他阵列组合或将每个组合成一维数组也不起作用.

任何想法都会非常有用,谢谢.

最佳答案 看起来你正在寻找 Kernel Density Estimation,这是一种将空间点模式的单独测量转换为连续分布的方法.我碰巧更喜欢 scikit-learn implementation.然后你可以使用底图包进行绘图.以下代码应该适应你的情况,其中ra和dec是你的星星的右升天和下降的数组(你必须小心这里的弧度与度数):

from sklearn.neighbors import KernelDensity
from sklearn.grid_search import GridSearchCV

data = np.column_stack((ra, dec))

# use a tophat/boxcar kernel and a haversine (spherical) metric
p = {'bandwidth': np.logspace(-1, 1, 20), 'kernel'='tophat', 
     'metric'='haversine'}
grid = GridSearchCV(KernelDensity(), params)
grid.fit(data)

然后你应该能够定义一个网格网格来评估你的KDE,然后使用imshow / pcolormesh /其他东西在Hammer投影上绘制它(见here或here)

点赞