Explicitly specifying line colors when plotting a matrix

247 ビュー (過去 30 日間)
Knut
Knut 2011 年 10 月 30 日
コメント済み: Image Analyst 2023 年 9 月 25 日
x = 1:3;
y = [1 2 3; 42 40 34];
plot(x,y,'Color', [0.5 0.5 0.5; 1 0 0])
produce an error:
Error using plot
Color value must be a 3 element numeric vector
Same with:
plot(x,y,'rg')
Error using plot
Error in color/linetype argument
This has bugged me for years, but I have circumvented it by unrolling the matrix into a number of vectors that I plot one at a time using whatever color I prefer. But is there no way to tell MATLAB (in a compact, readable form) what colors I would like it to use for whatever number of lines it will plot?
  1 件のコメント
ELTH
ELTH 2016 年 8 月 16 日
You can make a for loop and specify each line's colour based on the RGB code:
x = 1:3;
y = [22 20 18; 32 30 24; 42 40 34];
figure
hold on
for k=1:size(y,1)
p(k)=plot(x,y(k,1:end),'LineWidth',2);
set(p(k),'Color',[(size(y,1)-k+1)/size(y,1) k/size(y,1) 0.1]);
end

サインインしてコメントする。

採用された回答

Kelly Kearney
Kelly Kearney 2017 年 1 月 10 日
An alternative method would be to save the handles of the plotted data and set the colors via the array option of set. I find this method a lot less hassle than messing with ColorOrder and hold states:
x = 1:3;
y = [1 2 3; 42 40 34];
h = plot(x,y);
set(h, {'color'}, {[0.5 0.5 0.5]; [1 0 0]});
I often use the shortcut of using a colormap with num2cell to get the desired list of colors:
set(h, {'color'}, num2cell(jet(2),2));
  7 件のコメント
Simon Silge
Simon Silge 2021 年 11 月 26 日
編集済み: Simon Silge 2021 年 11 月 26 日
Since 2019 there is an easier way to do this by setting your own color order by using the colororder command.
x = 1:3;
y = [1 2 3; 42 40 34];
colororder([0 0 1; 0.5 0.6 0])
plot(x,y)
Aaron Drews
Aaron Drews 2023 年 6 月 13 日
Building on @Simon Silge's response, one can also use colororder with the preset colors (e.g., 'k', 'r', 'b', etc) if they're provided as a cell array:
x = 1:3;
y = [1 2 3; 42 40 34];
colororder({'r', 'b'})
plot(x, y)

サインインしてコメントする。

その他の回答 (3 件)

Image Analyst
Image Analyst 2011 年 10 月 30 日
In the help it says this:
"plot automatically chooses colors and line styles in the order specified by ColorOrder and LineStyleOrder properties of current axes. ColorOrder : m-by-3 matrix of RGB values
Colors to use for multiline plots. Defines the colors used by the plot and plot3 functions to color each line plotted. If you do not specify a line color with plot and plot3, these functions cycle through the ColorOrder property to obtain the color for each line plotted. To obtain the current ColorOrder, which might be set during startup, get the property value:
get(gca,'ColorOrder')
Note that if the axes NextPlot property is replace (the default), high-level functions like plot reset the ColorOrder property before determining the colors to use. If you want MATLAB to use a ColorOrder that is different from the default, set NextPlot to replacechildren. You can also specify your own default ColorOrder."
co = get(gca,'ColorOrder') % Initial
% Change to new colors.
set(gca, 'ColorOrder', [0.5 0.5 0.5; 1 0 0], 'NextPlot', 'replacechildren');
co = get(gca,'ColorOrder') % Verify it changed
% Now plot with changed colors.
x = 1:3;
y = [1 2 3; 42 40 34];
plot(x,y, 'LineWidth', 3);
The things I put in the set() command are especially important.
  6 件のコメント
Cici Ma
Cici Ma 2017 年 1 月 9 日
A note for subplot: need to put the set line before each plot command
x = 1:3;
y1 = [1 2 3; 42 40 34];
y2 = [3 5 8; 11 17 29];
subplot(2,1,1);
set(gca, 'ColorOrder', [0.5 0.5 0.5; 0.2 0.2 0.2],'NextPlot', 'replacechildren');
plot(x,y1, 'LineWidth', 3);
subplot(2,1,2);
set(gca, 'ColorOrder', [0.5 0.5 0.5; 0.2 0.2 0.2],'NextPlot', 'replacechildren');
plot(x,y2, 'LineWidth', 3);
And much appreciated to Image Analyst!
KAE
KAE 2017 年 1 月 10 日
And if you need to restore the color order to the defaults, use reset(gca).

サインインしてコメントする。


Daniele Maddaluno
Daniele Maddaluno 2017 年 12 月 8 日
編集済み: Daniele Maddaluno 2017 年 12 月 8 日
I can solve your problem with something like this:
x = 1:5;
y = [x; x.^2; x.^3; x.^4; x.^5];
n = size(y, 1);
colors = hsv(n);
h = plot(x, y);
set(h, {'color'}, num2cell(colors, 2));
  2 件のコメント
rosa agliata
rosa agliata 2017 年 12 月 20 日
just great! thanks a lot!
Vivek Bhardwaj
Vivek Bhardwaj 2019 年 2 月 14 日
Hi, works perfectly, thank you. I have a follow-up question to this. Is it possible that I can have the colors based on a different data set? i.e. I use X and Y only for plotting but the colors of the plot are based on data set, say P (Pressures).

サインインしてコメントする。


Joakim Wang Erlandsson
Joakim Wang Erlandsson 2018 年 9 月 19 日
It is beyond me how matlab manages to be so unintuitive in the most simple sitiations. Luckily there is a smart community that can find workarounds for all of these shortcomings. Someone above stated happily that this answer is still helping people years after it was asked, too me this is just sad, that Mathworks haven't improved this in all of that time.
  3 件のコメント
Jolanda Müller
Jolanda Müller 2023 年 9 月 25 日
I agree with you, Joakim. I think by now it should be possible to do something like "plot(x,Y, 'color', C), where Y is a matrix, and C contains as many colors as there will be lines.
Image Analyst
Image Analyst 2023 年 9 月 25 日
@Jolanda Müller you simply need to call the colororder function first before calling plot, instead of passing your colors into plot. It's hardly a horrendous hassle or even a "workaround". It's just a different way of doing things and only requires one line of code to tell it to use your custom colors.
numCurves = 20;
numPointsPerCurve = 10;
% Create matrix of data. Individual curves are in columns.
M = rand(numCurves, numPointsPerCurve);
% Create matrix of custom colors for each curve.
C = rand(numCurves, 3); % Just random colors.
colororder(C); % Tell MATLAB to use these custom colors.
% Plot 20 curves, each with it's own unique custom color.
plot(M, '.-', 'LineWidth', 2)

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeLabels and Annotations についてさらに検索

製品

Community Treasure Hunt

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

Start Hunting!

Translated by