257 views (last 30 days)

When using the function plot with hold set to 'all', each call to plot uses the successive entry in the ColorOrder property of the current axes. Is there a way to find out what is the color the next call to plot will use, if it is not known how many calls to plot have already been executed?

In other words, here is an example to clarify my question: plot(x,bob) hold all plot(x,garry) ... (unknown number of calls to plot)

What will be the color of the next plot?

Thanks, David

Daniel Shub
on 11 Jul 2011

I think the number of children should equal the number of calls to plot. You need to use mod to loop through the colors (i.e if the number of plots is greater than the number of colors).

colorOrder = get(gca, 'ColorOrder');

plot(1:10, 'Color', colorOrder(mod(length(get(gca, 'Children')), size(colorOrder, 1))+1, :))

Daniel Shub
on 11 Jul 2011

Jan
on 11 Jul 2011

What about trying it:

lineH = plot(1,1);

color = get(lineH, 'Color');

delete(lineH);

[EDITED]: Walter's comment pointed me to the fact, that the intermediate creation of a PLOT line changes the next color. This is not working

Walter Roberson
on 11 Jul 2011

Teja Muppirala
on 13 Jul 2011

This seems to work ok:

figure

hold all;

plot(rand(5,3));

h = plot(nan,nan);

nextcolor = get(h,'color')

h = plot(nan(2,size(get(gca,'colororder'),1)-1)); %Loop back

delete(h)

plot(rand(1,10)) %<-- This line's color is "nextcolor"

John Barber
on 14 Jul 2011

The next color to be used by a call to plot is stored as an index into the list of colors in the axes' ColorOrder property. You can access this index using:

NextColor = getappdata(hAx,'PlotColorIndex')

where hAx is the handle of the axes of interest. This is an undocumented feature, so it may not work in all MATLAB versions (I'm using R2010a / 7.10)

Jim Hokanson
on 9 Jan 2017

Edited: Jim Hokanson
on 9 Jan 2017

In newer versions of Matlab the state is stored in the axes as 'ColorOrderIndex'. In 2016b, this wraps, and you can get values from 1 to (n_colors+1) which after (n_colors+1) goes back to 2 (you only see 1 at the start of a plot, at least in this version).

So the next color is:

colors = get(gca,'ColorOrder');

index = get(gca,'ColorOrderIndex');

n_colors = size(colors,1);

if index > n_colors

index = 1;

end

next_color = colors(index,:);

J. Alex Lee
on 10 Apr 2020

Update in 2020 (not sure about previous versions), but it is now an exposed property in the axes:

ax = gca;

ax.ColorOrder

ax.ColorOrderIndex

Works for uiaxes() as well

Mauro
on 18 Aug 2014

to get the colour from the 1th to the 20th lineplot, type

cm = lines(20);

after the 7th line it starts again with blue [0 0 1]

so

figure(1)

clf

plot(randn(50,10)*0.1+repmat((1:10),50,1))

ist the same as

figure(1)

clf

cm = lines(10)

hold on

for k = 1:10

plot(randn(50,1)*0.1+k,'color',cm(k,:))

end

Opportunities for recent engineering grads.

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

Start Hunting!
## 4 Comments

## Direct link to this comment

https://se.mathworks.com/matlabcentral/answers/11366-get-next-plot-color#comment_24851

⋮## Direct link to this comment

https://se.mathworks.com/matlabcentral/answers/11366-get-next-plot-color#comment_24851

## Direct link to this comment

https://se.mathworks.com/matlabcentral/answers/11366-get-next-plot-color#comment_24856

⋮## Direct link to this comment

https://se.mathworks.com/matlabcentral/answers/11366-get-next-plot-color#comment_24856

## Direct link to this comment

https://se.mathworks.com/matlabcentral/answers/11366-get-next-plot-color#comment_24861

⋮## Direct link to this comment

https://se.mathworks.com/matlabcentral/answers/11366-get-next-plot-color#comment_24861

## Direct link to this comment

https://se.mathworks.com/matlabcentral/answers/11366-get-next-plot-color#comment_25279

⋮## Direct link to this comment

https://se.mathworks.com/matlabcentral/answers/11366-get-next-plot-color#comment_25279

Sign in to comment.