Контур сюжета закрашен кластеризацией точек матлаба - PullRequest
6 голосов
/ 03 февраля 2012

У меня есть два вектора, которые являются парными значениями

size(X)=1e4 x 1; size(Y)=1e4 x 1

Можно ли построить какой-то contour plot, создавая контуры по наибольшей плотности точек?Т.е. самая высокая кластеризация = красный, а затем градиентный цвет в другом месте?

Если вам нужно больше разъяснений, пожалуйста, спросите.С уважением,

ПРИМЕРНЫЕ ДАННЫЕ:

X=[53 58 62 56 72 63 65 57 52 56 52 70 54 54 59 58 71 66 55 56];  
Y=[40 33 35 37 33 36 32 36 35 33 41 35 37 31 40 41 34 33 34 37 ];
 scatter(X,Y,'ro');

enter image description here

Спасибо за помощь всем.Также вспомнили, что мы можем использовать hist3:

x={0:0.38/4:0.38}; % # How many bins in x direction
y={0:0.65/7:0.65}; % # How many bins in y direction

ncount=hist3([X Y],'Edges',[x y]);
pcolor(ncount./sum(sum(ncount)));
colorbar

Кто-нибудь знает, почему edges в Hist3 должны быть клетками?

Ответы [ 3 ]

9 голосов
/ 04 февраля 2012

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

В моем коде ниже я использовал ваш примерный набор данных и оценил плотность вероятности в сетке, настроенной по диапазону ваших данных.Здесь у вас есть 3 переменные, которые вы должны настроить, чтобы использовать в ваших исходных данных;Границы, Сигма и stepSize.

Border = 5;
Sigma = 5;
stepSize = 1;

X=[53 58 62 56 72 63 65 57 52 56 52 70 54 54 59 58 71 66 55 56];  
Y=[40 33 35 37 33 36 32 36 35 33 41 35 37 31 40 41 34 33 34 37 ];
D = [X' Y'];
N = length(X);


Xrange = [min(X)-Border max(X)+Border];
Yrange = [min(Y)-Border max(Y)+Border];


%Setup coordinate grid
[XX YY] = meshgrid(Xrange(1):stepSize:Xrange(2), Yrange(1):stepSize:Yrange(2));
YY = flipud(YY);

%Parzen parameters and function handle
pf1 = @(C1,C2) (1/N)*(1/((2*pi)*Sigma^2)).*...
         exp(-( (C1(1)-C2(1))^2+ (C1(2)-C2(2))^2)/(2*Sigma^2));

PPDF1 = zeros(size(XX));    

%Populate coordinate surface
[R C] = size(PPDF1);
NN = length(D);
for c=1:C
   for r=1:R 
       for d=1:N 
            PPDF1(r,c) = PPDF1(r,c) + ...
                pf1([XX(1,c) YY(r,1)],[D(d,1) D(d,2)]); 
       end
   end
end


%Normalize data
m1 = max(PPDF1(:));
PPDF1 = PPDF1 / m1;

%Set up visualization
set(0,'defaulttextinterpreter','latex','DefaultAxesFontSize',20)
fig = figure(1);clf
stem3(D(:,1),D(:,2),zeros(N,1),'b.');
hold on;

%Add PDF estimates to figure
s1 = surfc(XX,YY,PPDF1);shading interp;alpha(s1,'color');
sub1=gca;
view(2)
axis([Xrange(1) Xrange(2) Yrange(1) Yrange(2)])

enter image description here

Обратите внимание, что эта визуализация на самом деле является трехмерной:

enter image description here

2 голосов
/ 04 февраля 2012

Смотрите это 4-минутное видео на сайте математических работ:

http://blogs.mathworks.com/videos/2010/01/22/advanced-making-a-2d-or-3d-histogram-to-visualize-data-density/

Я полагаю, что это должно обеспечить почти такую ​​же функциональность, которая вам требуется.

1 голос
/ 04 февраля 2012

Я бы разделил область, которую покрывает график, на сетку, а затем посчитал количество точек в каждом квадрате сетки. Вот пример того, как это можно сделать.

% Get random data with high density
X=randn(1e4,1);
Y=randn(1e4,1);

Xmin=min(X);
Xmax=max(X);
Ymin=min(Y);
Ymax=max(Y);
% guess of grid size, could be divided into nx and ny
n=floor((length(X))^0.25); 

% Create x and y-axis
x=linspace(Xmin,Xmax,n);
y=linspace(Ymin,Ymax,n);
dx=x(2)-x(1);
dy=y(2)-y(1);
griddata=zeros(n);
for i=1:length(X)
    % Calculate which bin the point is positioned in
    indexX=floor((X(i)-Xmin)/dx)+1;
    indexY=floor((Y(i)-Ymin)/dy)+1;
    griddata(indexX,indexY)=griddata(indexX,indexY)+1;
end
contourf(x,y,griddata)

Edit: видео в ответе Marm0t использует ту же технику, но, вероятно, объясняет это лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...