How to assign diffrent colors and shapes to diffirent groups in a plot?

Hello, I'm trying to make a plot containing multiple groups, and each group has multiple values, but I don't know how to give different groups different colors and shapes
here's an example of my code, in this case I want to assign diffirent colors and shaples to different groups (A,B,C,D,E).
Many thanks!
clear;clc;close all;
Group = {'A','B','C','D','E'};
C3 = cellstr(Group); % convert cell to string
C4 = categorical(C3);% convert string to categorical
a = [1; 2; 3]; b = [4; 5; 6]; c = [6; 7; 8]; d = [9; 10; 11]; e = [12;13; 14];
data=[a,b,c,d,e];
plot(data, C4, 'LineStyle','none', 'Marker','o');

2 Comments

cellstr does nothing in that case, since Group is already a cell array of character vectors.
Group = {'A','B','C','D','E'};
C3 = cellstr(Group);
isequal(C3,Group)
ans = logical
1
Yes, I've already learned the lession from Dyuman Joshi, who helped me with this question, but still thanks!

Sign in to comment.

 Accepted Answer

Is this what you wanted to achieve:
clearvars;clc;close all;
Group = {'A','B','C','D','E'};
C3 = cellstr(Group); % convert cell to string
C4 = categorical(C3);% convert string to categorical
a = [1; 2; 3]; b = [4; 5; 6]; c = [6; 7; 8]; d = [9; 10; 11]; e = [12;13; 14];
data=[a,b,c,d,e];
MT = {'d', 'o', 's', 'p', '^'};
MC = {'r', 'g', 'b', 'c', 'm'};
MFC = {'r', 'g', 'b', 'c', 'm'};
for ii=1:numel(C4)
plot(data(:,ii), C4(ii), strcat(MT{ii}, MC{ii})); hold all
end

9 Comments

Thanks! That's exactly what I want!
Most welcome! Glad to be of some help! Merry Christmas
A follow-up question if I may, in your example, I can only use color name (like 'r' or 'b' ) to assign colors, but cannot use RGB triplet or hexadecimal color code right? cuz I tried the other two and it tells me that they are invalid colors
RGB triplet can be also implemented as numerical values,e.g.:
clearvars;clc;close all;
Group = {'A','B','C','D','E'};
C3 = cellstr(Group); % convert cell to string
C4 = categorical(C3);% convert string to categorical
a = [1; 2; 3]; b = [4; 5; 6]; c = [6; 7; 8]; d = [9; 10; 11]; e = [12;13; 14];
data=[a,b,c,d,e];
MT = {'d', 'o', 's', 'p', '^'};
MC = [ 1 0 1; 1 1 0; 0 1 1; .75 .5 .25; .5 .75 .75];
MFC = {'r', 'g', 'b', 'c', 'm'};
for ii=1:numel(C4)
plot(data(:,ii), C4(ii), MT{ii}, 'MarkerEdgeColor', MC(ii,:), 'MarkerFaceColor', MFC{ii}); hold all
end
Also it seems only works if I combine colors and shapes together, if I try to seprate them then it doesn't work, error message see below. Any idea why? Thanks!
clearvars;clc;close all;
Group = {'A','B','C','D','E'};
C3 = cellstr(Group); % convert cell to string
C4 = categorical(C3);% convert string to categorical
a = [1; 2; 3]; b = [4; 5; 6]; c = [6; 7; 8]; d = [9; 10; 11]; e = [12;13; 14];
data=[a,b,c,d,e];
MT = {'d', 'o', 's', 'p', '^'};
MC = {'r', 'g', 'b', 'c', 'm'};
MFC = {'r', 'g', 'b', 'c', 'm'};
for ii=1:numel(C4)
plot(data(:,ii), C4(ii), 'MarkerEdgeColor',MC(ii),'Marker', MT(ii)); hold all
end
Error using plot
Invalid RGB triplet. Specify a three-element vector of values between 0 and 1.
If you use cell array notation, it will work, see:
clearvars;clc;close all;
Group = {'A','B','C','D','E'};
C3 = cellstr(Group); % convert cell to string
C4 = categorical(C3);% convert string to categorical
a = [1; 2; 3]; b = [4; 5; 6]; c = [6; 7; 8]; d = [9; 10; 11]; e = [12;13; 14];
data=[a,b,c,d,e];
MT = {'d', 'o', 's', 'p', '^'};
MC = {'r', 'g', 'b', 'c', 'm'};
MFC = {'r', 'g', 'b', 'c', 'm'};
for ii=1:numel(C4)
plot(data(:,ii), C4(ii), 'MarkerEdgeColor',MC{ii},'Marker', MT{ii}); hold all
end
Thanks, this is super helpful! Merry Christmas!

Sign in to comment.

More Answers (1)

If you have the Statistics and ML toolbox, you can utilize gscatter -
Group = {'A','B','C','D','E'};
%You can convert to categorical directly, cellstr is redundant
C4 = categorical(Group)
C4 = 1×5 categorical array
A B C D E
a = [1; 2; 3]; b = [4; 5; 6]; c = [6; 7; 8]; d = [9; 10; 11]; e = [12;13; 14];
data=[a,b,c,d,e];
%Number of groups
s = numel(C4);
%Select colors for each group from a colormap
colors = hsv(s);
%Define symbols for each group
symbols = 'o.xd*';
%The symbols are respectively - circle dot cross diamond star/asterik
gscatter(data.', C4, C4, colors, symbols, 8, 'doleg', 'off')

4 Comments

Many thanks for the help, this way works as well!
in this example, can I define colors myself, instead of using a color map like hsv? thanks!
Yes, you can -
Group = {'A','B','C','D','E'};
%You can convert to categorical directly, cellstr is redundant
C4 = categorical(Group)
C4 = 1×5 categorical array
A B C D E
a = [1; 2; 3]; b = [4; 5; 6]; c = [6; 7; 8]; d = [9; 10; 11]; e = [12;13; 14];
data=[a,b,c,d,e];
%Number of groups
s = numel(C4);
%Define colors manually
colors = [1 0 0; 0 1 0; 0 0 1; 1 0 1; 0 1 1];
%Define symbols for each group
symbols = 'o.xd*';
%The symbols are respectively - circle dot cross diamond star/asterik
gscatter(data.', C4, C4, colors, symbols, 8, 'doleg', 'off')

Sign in to comment.

Categories

Find more on Convert Image Type in Help Center and File Exchange

Products

Release

R2021a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!