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

时间:2015-12-03 19:27:43

标签: python smooth scatter 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)

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

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

1 个答案:

答案 0 :(得分:1)

看起来你正在寻找Kernel Density Estimation,这是一种将空间点模式的单个测量值转换为连续分布的方法。我碰巧更喜欢scikit-learn implementation。然后,您可以使用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,然后使用imshow / pcolormesh /其他东西在Hammer投影上绘制它(见{{ 3}}或here