绘制散点图最密集区域的轮廓

Fri*_*rub 6 python numpy matplotlib contour scipy

我正在生成一个约30万个数据点的散点图,并且我遇到的问题是它在一些地方过于拥挤,没有结构可见 - 所以我有一个想法!

我希望绘图生成最密集部分的等高线图,并使用scatter()数据点留下密度较小的区域.

所以我试图为每个数据点单独计算最近邻距离,然后当该距离达到特定值时,绘制轮廓并填充它,然后当它达到更大的值(密度更小)时,只需执行分散...

我一直在努力和失败几天,我不确定传统的轮廓图在这种情况下是否有效.

我会提供代码,但它太乱了,可能会混淆问题.它的计算密集程度很高,如果它确实有效,它可能会崩溃我的电脑!

谢谢大家!

ps我一直在寻找并寻找答案!我确信它出现的所有结果都不可能!

编辑:所以这个想法是看看300k样本结构中某些特定点的位置.这是一个示例情节,我的点分散在三个差异中.颜色. 我的分散版数据

我将尝试从我的数据中随机抽取1000个数据点并将其作为文本文件上传.干杯堆叠器.:)

编辑:嘿,这里有一些示例数据1000行 - 只有两列[X,Y](或上[g-i,i]图)空格分隔.谢谢你们! 数据

Fri*_*rub 3

四年后,我终于可以回答这个问题了!这可以使用matplotlib.path中的contains_points来完成。

我使用了来自astropy的高斯平滑,可以根据需要省略或替换。

import matplotlib.colors as colors
from matplotlib import path
import numpy as np
from matplotlib import pyplot as plt
try:
    from astropy.convolution import Gaussian2DKernel, convolve
    astro_smooth = True
except ImportError as IE:
    astro_smooth = False

np.random.seed(123)
t = np.linspace(-1,1.2,2000)
x = (t**2)+(0.3*np.random.randn(2000))
y = (t**5)+(0.5*np.random.randn(2000))

H, xedges, yedges = np.histogram2d(x,y, bins=(50,40))
xmesh, ymesh = np.meshgrid(xedges[:-1], yedges[:-1])

# Smooth the contours (if astropy is installed)
if astro_smooth:
    kernel = Gaussian2DKernel(stddev=1.)
    H=convolve(H,kernel)

fig,ax = plt.subplots(1, figsize=(7,6)) 
clevels = ax.contour(xmesh,ymesh,H.T,lw=.9,cmap='winter')#,zorder=90)

# Identify points within contours
p = clevels.collections[0].get_paths()
inside = np.full_like(x,False,dtype=bool)
for level in p:
    inside |= level.contains_points(zip(*(x,y)))

ax.plot(x[~inside],y[~inside],'kx')
plt.show(block=False)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述