4

我相信解决这个问题会相对简单,但我似乎无法弄清楚如何对我在 python 中绘制的散点图进行卷积。

我有 2 个数据数组,一个是银河纬度,一个是银河经度,我用锤子投影绘制了它们,以表示银河坐标中恒星的分布。

现在,我想使用 boxcar 平滑来平滑 15 度框的图。我曾尝试将 astropy.convolution 与 convolve 和 Box2DKernel 一起使用,但我似乎无法使其工作。我还查看了来自http://docs.astropy.org/en/stable/convolution/kernels.html的示例, 但我不明白如何将他们的示例转换为我需要做的事情。他们似乎正在绘制一个二维函数并对其进行平滑处理。我可以不卷积一个图并根据它们在图表上的位置将这些点分类吗?我唯一能显示任何东西的东西都会产生一条直线,我不明白为什么。我对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)

就像我说的那样,这只是最终给出一些东西而不是错误的众多尝试之一,但我不确定我是否完全正确地使用了该功能。我不确定(或者我不认为)我可以像我那样创建“数据”,但是任何其他数组组合或将每个数组卷积为一维数组也不起作用。

任何想法都会非常有帮助,谢谢。

4

1 回答 1

1

您似乎正在寻找Kernel Density Estimation,这是一种将空间点模式的单个测量值转换为连续分布的方法。我碰巧更喜欢scikit-learn 实现。然后,您可以使用该basemap软件包进行绘图。下面的代码应该适应你的情况,你的星星的赤经和赤纬数组在哪里radec是(你必须小心弧度和度数):

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)

然后你应该能够定义一个meshgrid评估你的 KDE 的方法,然后在 Hammer 投影上使用imshow//pcolormesh其他东西来绘制它(见这里这里

于 2015-12-16T17:14:46.800 回答