MATLAB Answers

1

Get next plot color

Asked by David C on 11 Jul 2011
Latest activity Edited by Jim Hokanson on 9 Jan 2017
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

  4 Comments

Show 1 older comment
Daniel Shub
on 11 Jul 2011
plotyy is interesting since it actually makes an extra axis. I think most plotting functions now only add a single child to the axis. For example, I believe errorbar used to add multiple children.
Walter Roberson
on 11 Jul 2011
There are many plotting functions that add multiple children -- though the top level child might be an hggroup .
plot() adds multiple line() objects; bar() adds multiple patch() objects; boxplot() adds a combination of objects; polar() adds a combination of objects; contour() adds an hggroup that has patch() objects and text() objects as its children...
David C on 13 Jul 2011
Thank you for the input everyone.

Sign in to comment.

Tags

6 Answers

Daniel Shub
Answer by Daniel Shub
on 11 Jul 2011
 Accepted Answer

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, :))

  2 Comments

Daniel Shub
on 11 Jul 2011
To deal with Walter's observation about plotyy, I guess you would need to check the figure for all children which are axes. You then might want to count the children of any axes which have identical positions to the axis you are interested in.
David C on 13 Jul 2011
Your code works well with plot(), which is what I'm using. I like how your code handles the corner cases with mod perfectly.

Sign in to comment.


Jan
Answer by 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

  2 Comments

Walter Roberson
on 11 Jul 2011
Hmmm -- would the next plot() after that re-use the now-available color, or would it consider it to have been "already used" and move on to the color after that?
David C on 13 Jul 2011
Although not ideal for the purpose I had in mind, it is a good idea.

Sign in to comment.


Teja Muppirala
Answer by 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"

  3 Comments

Walter Roberson
on 13 Jul 2011
Heh. ;-)
David C on 13 Jul 2011
This is very clever; thank you. As Daniel's answer was the first that worked for me, I have accepted his answer.
Jan
on 13 Jul 2011
If the LineStyleOrder is not scalar, it should be considered also.

Sign in to comment.


Answer by 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)

  0 Comments

Sign in to comment.


Answer by Jim Hokanson on 9 Jan 2017
Edited by 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,:);

  0 Comments

Sign in to comment.


Mauro
Answer by 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

  0 Comments

Sign in to comment.