2013-10-11 3 views
6

Я создаю рассеянную диаграмму в ~ 300 тыс. Точек данных, и у меня возникает проблема, что она настолько переполнена в некоторых местах, что никакая структура не видна - так что у меня была мысль !Контуры участка для самой плотной области рассеянного участка

Я хочу, чтобы график создавал контурный график для самых плотных частей и оставлял менее плотные области с точками данных scatter().

Поэтому я пытался индивидуально вычислить расстояние между ближайшими соседями для каждой из точек данных, а затем, когда это расстояние достигло определенного значения, нарисуйте контур и заполните его, а затем, когда он достигнет гораздо большего значения (менее плотный) просто сделайте разброс ...

Я пробовал и терпел неудачу в течение нескольких дней, я не уверен, что условный контурный график будет работать в этом случае.

Я бы поставил код, но он настолько грязный и, вероятно, просто путают проблему. И это настолько интенсивно вычислительно, что, возможно, это просто разрушит мой компьютер, если он сработает!

Спасибо вам заранее!

p.s. Я искал и искал ответ! Я убежден, что это невозможно даже для всех результатов, которые он получил!

Редактировать: Таким образом, идея состоит в том, чтобы увидеть, где некоторые конкретные точки лежат в структуре образца 300k. Вот пример сюжета, мои точки разбросаны по трем разным. цвета. My scatter version of the data

Я попытаюсь случайным образом пробовать 1000 datapoints из моих данных и загружать их в текстовый файл. Приветствия штабелеры. :)

Edit: Эй, Вот некоторые примеры данных 1000 строк - всего две колонки [X,Y] (или [g-i,i] от участка выше) пространства с разделителями. Спасибо вам всем! the data

+2

В зависимости от того, как переполненный эти значения, вы могли бы, вероятно, дразнить некоторую структуру из просто делая 'разброс (х, у, альфа = 0,1)' или какой-то подходящее малое значение. Чтобы сделать то, что вы предлагаете, я бы построил оценку плотности ядра (см. 'Scipy.stats.kde'). – chthonicdaemon

+3

Почему вы не используете 2-гистограмму для отображения ваших данных? –

+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 для создания маски всех мест, которые находятся в пределах плотности мишени
  4. Bin данные, либо с прямоугольным бункером или plt.hexbin ,
  5. Постройте контур из данных с биннами, но используйте маску с шага 3., чтобы отфильтровать области с более низкой плотностью.
  6. Используйте обратную сторону маски для plt.scatter оставшихся пунктов.
+0

Я действительно не пробовал это прямо, но это по сути то, что я закончил делать. Я прибегал к использованию гексагонального «теплового графика», потому что я не мог уменьшить время вычисления контура из порядка n^n -_- ... возможно, стоит вернуться и смотреть на него было забавной проблемой. – FriskyGrub

Смежные вопросы