Color Different Scatter Points Based on Group
    15 views (last 30 days)
  
       Show older comments
    
    Brian Tomblin
 on 24 Jun 2016
  
    
    
    
    
    Commented: Walter Roberson
      
      
 on 1 Jul 2016
            Hello,
I have a great deal of points on a 3D scatter plot that I need to be shown in different colors. They need to be categorized in color based on a label that they are given in the data set. All examples I have seen for coloring markers in scatter plots has been based on distance/position (which is not what I need).
Any help with how to code color markers based on grouping/labeling would be appreciated!
0 Comments
Accepted Answer
  Walter Roberson
      
      
 on 24 Jun 2016
        [unique_groups, ~, group_idx] = unique(Your_Group_Labels);
num_groups = size(unique_groups, 1);
if isnumeric(unique_groups)
   group_names = cellstr( num2str( unique_groups ) );
elseif ischar(unique_groups)
  group_names = mat2cell( unique_groups, ones(1, num_groups), size(unique_groups, 2) );
elseif iscell(unique_groups)
  group_names = unique_groups;
else
  error('I do not know how to convert group labels of class "%s" to printable strings', class(unique_groups));
end
pointsize = 30;
scatter3(x, y, z, pointsize, group_idx);
cmap = jet(num_groups);    %or build a custom color map
colormap( cmap );
legend(group_names);
If only you knew ahead of time what the data class of your labels was going to be, then you could simplify your code...
4 Comments
  Walter Roberson
      
      
 on 1 Jul 2016
				If you have a cell array of (unique) labels, and an N x 3 RGB array of corresponding color specifications, then the easiest way would be to sort() the (unique) label names and pull out the sorting order (second output of sort()) and use that order to rearrange the color table rows to create the cmap variable above, and also use the order to re-arrange the legends. To phrase that a different way, you should create a colormap variable whose rows are in the same order as the alphanumeric sort order as the labels themselves, and likewise a rearranged legend
[~, sortidx] = sort(label_name_table);
ordered_cmap = corresponding_color_table(sortidx, :);
ordered_legends = corresponding_legend_entries(sortidx);
[~, ~, group_idx] = unique(Your_Group_Labels);
pointsize = 30;
scatter3(x, y, z, pointsize, group_idx);
colormap( ordered_cmap );
legend( ordered_legends );
More Answers (1)
  Chad Greene
      
      
 on 24 Jun 2016
        Similar to Walter's solution:
% define 25 random points: 
x = randn(25,1); 
y = randn(25,1); 
% Each x,y point is in group 1, group 2, or group 3: 
group = randi(3,25,1); 
% Plot: 
plot(x(group==1),y(group==1),'.','markersize',20,'color','green'); 
hold on
plot(x(group==2),y(group==2),'.','markersize',20,'color','red'); 
plot(x(group==3),y(group==3),'.','markersize',20,'color','black'); 
legend('group 1','group 2','group 3')

2 Comments
See Also
Categories
				Find more on Data Distribution Plots in Help Center and File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!

