Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

scatterplot visualize the same points in matlab

I have the following problem: I need to build the scatterplot of the data. Everything nice, but there is some duplicate data there:

x = [11, 10, 3, 8, 2, 6, 2, 3, 3, 2, 3, 2, 3, 2, 2, 2, 3, 3, 2, 2];
y = [29, 14, 28, 19, 25, 21, 27, 15, 24, 23, 23, 18, 0, 26, 11, 27, 23, 30, 30, 25];

One can see that there are two elements with (2, 25); (2,27); (3,24); So if to build this data with a regular scatter(x,y) I am loosing this information: enter image description here

The way out of this I have found is to use undocumented 'jitter' parameter

scatter(x,y, 'jitter','on', 'jitterAmount', 0.06);

But I do not like the outlook: enter image description here

What I was trying to achieve is this:

enter image description here

Where the number of duplicates is next to the point (if the number is more than 1), or may be inside the point.

Any idea how to achieve this?

like image 464
Salvador Dali Avatar asked Dec 08 '12 15:12

Salvador Dali


1 Answers

You can do that pretty easily, let's cut it down in two parts:

First you're gonna need to identify the unique 2d points and count them. That's what we have the unique and accumarray function for. Read through the documentation if you don't immediately understand what they're doing and what outputs they have:

x = [11 10 3  8  2  6  2  3  3  2  3  2  3  2  2  2  3  3  2  2];
y = [29 14 28 19 25 21 27 15 24 23 23 18 0  26 11 27 23 30 30 25];
A=[x' y'];

[Auniq,~,IC] = unique(A,'rows');
cnt = accumarray(IC,1);

Now each row of Auniq contains the unique 2d points, while cnt contains the number of occurences of each of those points:

>> [cnt Auniq]

ans =

     1     2    11
     1     2    18
     1     2    23
     2     2    25
     1     2    26
     ...etc

For displaying the number of occurences, there are a great many possibilities. As you mentioned, you could put the numbers inside/next to the scatter markers, other options are color encoding, size of the markers,... let's do all of these, you can also of course combine!

Number next to marker

scatter(Auniq(:,1), Auniq(:,2));
for ii=1:numel(cnt)
    if cnt(ii)>1
        text(Auniq(ii,1)+0.2,Auniq(ii,2),num2str(cnt(ii)), ...
            'HorizontalAlignment','left', ...
            'VerticalAlignment','middle', ...
            'FontSize', 6);
    end
end
xlim([1 11]);ylim([0 30]);

enter image description here

Number inside marker

scatter(Auniq(:,1), Auniq(:,2), (6+2*(cnt>1)).^2); % make the ones where we'll put a number inside a bit bigger

for ii=1:numel(cnt)
    if cnt(ii)>1
        text(Auniq(ii,1),Auniq(ii,2),num2str(cnt(ii)), ...
            'HorizontalAlignment','center', ...
            'VerticalAlignment','middle', ...
            'FontSize', 6);
    end
end

as you can see, I enlarged the size of the markers very simply with the scatter function itself.

enter image description here

Color encoding

scatter(Auniq(:,1), Auniq(:,2), [], cnt);
colormap(jet(max(cnt))); % just for the looks of it

enter image description here

after which you can add a colorbar or legend to indicate the number of occurences per color.

like image 53
Gunther Struyf Avatar answered Nov 15 '22 07:11

Gunther Struyf