Reputation: 5595
In many MATLAB plotting functions, you can specify the color as either a string or as a 3 element vector that directly lists the red, green, and blue values.
For instance, these two statements are equivalent:
plot(x, y, 'Color', 'r');
plot(x, y, 'Color', [1 0 0]);
There are 8 colors that can be specified by a string value: 'r','g','b','c','m','y','k','w'
. Is there a MATLAB built-in function that converts these strings to an equivalent RGB vector?
Upvotes: 8
Views: 15506
Reputation: 805
There's no MATLAB built-in function to convert 'r','g','b','c','m','y','k','w'
to the respective RGB colours because all these cases are well known to be BASIC colours.
Every one blending BASIC colours should know each and all of them, at all times.
In any case it may be useful to build a table or define constants using the following values:
1.- Primary additive colours
red green blue
r [255 0 0]
g [0 255 0]
b [0 0 255]
2.- Primary subtractive colours
cyan magenta yellow
c [0 255 255]
m [255 0 255]
y [255 255 0]
3.- black : absence of any colour
k [0 0 0]
4.- white : all colours
w [255 255 255]
Note that in MATLAB the command plot
requires field 'Color'
input with range [0 1]
.
so whatever values [0 255]
used divide them by 255
to plot custom colours.
Upvotes: 0
Reputation: 31
here's a oneliner you don't have to solve for C:
str2rgb=@(x)get(line('color',x),'color');
Now str2rgb
gives you the answer. for example str2rgb('c') = [0 1 1]
.
Upvotes: 3
Reputation: 5595
In case there isn't, I just hacked one together
function rgbvec = char2rgb (charcolor)
%function rgbvec = char2rgb (charcolor)
%
%converts a character color (one of 'r','g','b','c','m','y','k','w') to a 3
%value RGB vector
%if charcolor is a string (vector of chars), the result is a Nx3 matrix of
%color values, where N is the length of charcolor
if (~exist(charcolor,'var') || ~ischar(charcolor))
warning('RGB2VEC:NOTC', 'You must pass a character (rgbcmykw)');
rgbvec = [0 0 0];
return;
end
rgbvec = zeros(length(charcolor), 3);
charwarning = false;
for j = 1:length(charcolor)
switch(lower(charcolor(j)))
case 'r'
rgbvec(j,:) = [1 0 0];
case 'g'
rgbvec(j,:) = [0 1 0];
case 'b'
rgbvec(j,:) = [0 0 1];
case 'c'
rgbvec(j,:) = [0 1 1];
case 'm'
rgbvec(j,:) = [1 0 1];
case 'y'
rgbvec(j,:) = [1 1 0];
case 'w'
rgbvec(j,:) = [1 1 1];
case 'k'
rgbvec(j,:) = [0 0 0];
otherwise
charwarning = true;
end
end
if (charwarning)
warning('RGB2VEC:BADC', 'Only r,g,b,c,m,y,k,and w are recognized colors');
end
Upvotes: 5
Reputation: 125854
I found this general alternative on the MathWorks File Exchange which will even handle color strings other than the default 8 in MATLAB:
If you're only concerned with conversions for the default 8 color strings, here's a function I wrote myself that I use to convert back and forth between RGB triples and short color names (i.e. single characters):
function outColor = convert_color(inColor)
charValues = 'rgbcmywk'.'; %#'
rgbValues = [eye(3); 1-eye(3); 1 1 1; 0 0 0];
assert(~isempty(inColor),'convert_color:badInputSize',...
'Input argument must not be empty.');
if ischar(inColor) %# Input is a character string
[isColor,colorIndex] = ismember(inColor(:),charValues);
assert(all(isColor),'convert_color:badInputContents',...
'String input can only contain the characters ''rgbcmywk''.');
outColor = rgbValues(colorIndex,:);
elseif isnumeric(inColor) || islogical(inColor) %# Input is a numeric or
%# logical array
assert(size(inColor,2) == 3,'convert_color:badInputSize',...
'Numeric input must be an N-by-3 matrix');
inColor = double(inColor); %# Convert input to type double
scaleIndex = max(inColor,[],2) > 1; %# Find rows with values > 1
inColor(scaleIndex,:) = inColor(scaleIndex,:)./255; %# Scale by 255
[isColor,colorIndex] = ismember(inColor,rgbValues,'rows');
assert(all(isColor),'convert_color:badInputContents',...
'RGB input must define one of the colors ''rgbcmywk''.');
outColor = charValues(colorIndex(:));
else %# Input is an invalid type
error('convert_color:badInputType',...
'Input must be a character or numeric array.');
end
Note that this function allows you to input either a string of characters or an N-by-3 numeric or logical array (with RGB values from 0 to 1 or 0 to 255) and it returns the opposite color representation. It also uses the function ISMEMBER to do the conversions.
Upvotes: 8
Reputation: 3330
I don't think there is a function for this in matlab. I suggest you use Marcs function, or this one-liner.
C = rem(floor((strfind('kbgcrmyw', C) - 1) * [0.25 0.5 1]), 2);
Upvotes: 6