2013-10-11 90 views
6

我正在生成〜300k个数据点的散点图,并且存在问题,因为它在某些地方过于拥挤,导致没有结构可见 - 所以我有一个想法!绘制散点图最密集区域的轮廓

我想让该图为最密集的部分生成一个等值线图,并使用scatter()数据点留下密度较小的区域。

所以我试图单独计算每个数据点的最近邻距离,然后当这个距离达到一个特定的值时,绘制一个轮廓并填充它,然后当它达到一个更大的值时)只是做分散...

我一直在尝试和失败了几天,我不知道传统的等高线图将在这种情况下工作。

我会提供代码,但它很杂乱,可能会混淆这个问题。它的计算密集程度如此之高,它可能会让我的电脑死机!

谢谢大家提前!

p.s.我一直在寻找和寻找答案!我相信它甚至不可能实现所有结果!

编辑:所以这个想法是看看哪些特定点位于300k样本的结构中。这是一个示例图,我的观点分散在三个差异中。颜色。 My scatter version of the data

我将尝试从我的数据中随机采样1000个数据点并将其上传为文本文件。 干杯堆垛机。 :)

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

+2

根据如何拥挤这些值是,你很可能通过只是做'散射(X,Y,α-= 0.1)'或一些合适的小值逗一些结构出来。要做你的建议,我会建立一个核心密度估计(见'scipy.stats.kde')。 – chthonicdaemon

+3

为什么不使用二维直方图来显示数据? –

+1

@FriskyGrub您可以提供与您的实际数据具有相同类型/形状/等的随机数据 - 您并不总是需要首先发布生成真实数据的复杂步骤。使我们更容易提供对您有用的答案。 – YXD

回答

0

4年后,我终于可以回答这个问题了! 这可以使用从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) 

enter image description here

1

您可以用各种numpy的/ SciPy的/ matplotlib工具实现这一点:

  1. 创建原始点快速查找的scipy.spatial.KDTree
  2. 使用np.meshgrid到你想要的轮廓
  3. 使用KDTree.query创建的目标密度
  4. 斌数据内的所有位置的面具决议创建的网格点,无论是与矩形箱或plt.hexbin
  5. 绘制装箱数据中的轮廓,但使用步骤3中的遮罩来过滤掉较低密度的区域。
  6. 使用面具的反面plt.scatter其余点。
+0

我并没有直接尝试过这个,但这实际上就是我最终做的。我使用了一个hexbin'heat plot',因为我无法减少轮廓的计算时间n^n -_- ...可能值得回头看看它是一个有趣的问题。 – FriskyGrub