2013-10-11 93 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