2013-10-11 37 views
6

私は〜300kデータ点の散布図を生成しており、構造が見えない場所では非常に混雑しているという問題があります。 !散布図の最も濃密な領域の輪郭をプロットする

私はプロットに最も密な部分の等高線プロットを生成し、より密度の低い領域をデータポイントscatter()で残したいと思っています。

データポイントごとに最近傍距離を個別に計算してから、この距離が特定の値に達すると、輪郭線を描いて塗りつぶしてから、はるかに大きな値)ちょうど散布をしてください...

私は数日のうちに試して失敗しましたが、私は従来の等高線図がこの場合にはうまくいくとは確信していません。

私はコードを提供しますが、それはとても面倒で、おそらく問題を混乱させるだけです。そしてそれはそれが働いた場合、おそらくちょうど私のPCをクラッシュさせるように計算集約的です!

ありがとうございました!

p.s.私は検索して答えを探しています!私はそれが現れたすべての結果についても可能ではないと確信しています!

編集:これは、300kサンプルの構造内の特定の点がどこにあるのかを確認することです。ここでは例のプロットですが、私のポイントは3つのdiffに散在しています。色。 My scatter version of the data

データから無作為に1000のデータポイントをサンプリングしてテキストファイルとしてアップロードしようとします。 乾杯。 :)

編集:ちょっと、 ここでは、いくつかのサンプルデータ1000行 - ちょうど2つの列[X,Y](または上記のプロットから[g-i,i])のスペースが区切られています。皆さん、ありがとうございました! the data

+2

これらの値は、混雑した方法に応じて、あなたはおそらくちょうど '散布(X、Y、アルファ= 0.1)'または何らかの適した小さな値をすることによって、いくつかの構造を引き出すことができます。あなたが提案したことをするために、私はカーネル密度推定値を作成します( 'scipy.stats.kde'参照)。 – chthonicdaemon

+3

2dヒストグラムを使用してデータを表示してみませんか? –

+1

@FriskyGrubあなたは、あなたの実際のデータと同じタイプ/形状/ etcのランダムなデータを提供することができます。最初の場所に実際のデータを生成した複雑なステップを必ずしも投稿する必要はありません。私たちがあなたに役立つ回答をもっと簡単に提供します。 – YXD

答えて

0

4年後、私はついにこれに答えることができます! contains_pointsからmatplotlib.pathを使用してこれを行うことができます。

私は、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は、長方形のビンまたはplt.hexbinのいずれか、データ目標濃度内にあるすべての場所
  4. ビンのマスクを作成したい解像度で点のグリッドを作成します。
  5. ビニングされたデータから輪郭をプロットしますが、ステップ3のマスクを使用して低密度領域を除外します。
  6. 残りの点をplt.scatterにマスクの逆行列を使用します。
+0

私は実際にこれを直接試したことはありませんが、これは本質的に私がやったことです。私は、ヘビン 'ヒートプロット'を使うことに頼った。なぜなら、輪郭の計算時間をn^n -_- ...から戻すことができなかったからだ。戻ってみる価値があるのは面白い問題だったかもしれない。 – FriskyGrub