MATLAB Answers

the cyclist
2

How to change the color of individual bars in a bar chart?

Asked by the cyclist
on 31 Oct 2016
Latest activity Answered by Yaser Khojah about 12 hours ago

Make a simple bar chart (and get its handle):

figure
rng default
hb = bar(rand(1,3));

How can I set the colors of those bars now (after I have made the figure)? I want each bar to be a different color.

I am specifically asking about MATLAB R2016b.

I asked a very similar question about MATLAB R2014b earlier, but that method no longer seems to work. (Or I am overlooking something again.

  0 Comments

Sign in to comment.

Tags

4 Answers

Answer by Image Analyst
on 1 Nov 2016
Edited by Image Analyst
on 1 Nov 2016
 Accepted Answer

See attached demo.
Sorry - it's basically the same as what Sean did, just fancier and more flexible. You could put a wrapper around it to make it easier to use though.

  0 Comments

Sign in to comment.


Answer by Sean de Wolski
on 31 Oct 2016

Why not just make a second bar?
y = rand(1,3);
hb = bar(y);
hold on
hbr = bar(2,y(2),'r');

  2 Comments

I appreciate the answer, but ...
Ugh. Let's hope there is a way to do this via the properties of one bar chart, rather using N bar commands for an N-bar chart.
I don't know of a way to do it using documented properties. You can trick bar into returning a bar array by padding with NaNs but then you need to deal with limits and ticks yourself all while still creating more bars so it's not saving you anything but is adding more headache.
b = bar([rand(1,3);nan(1,3)],'b')
b(2).FaceColor = 'r'
Which is why calling bar a few times is really not the end of the world. It's not like with a line where there could be millions of points so you're going to chew up data to plot duplicate lines. Most figures will only have less than few dozen bars total.
All of this said, I think it's a fair enhancement request to have an option to get back a handle to each bar separately.

Sign in to comment.


Answer by Dr. Murtaza Khan on 16 Mar 2019
Edited by Dr. Murtaza Khan on 16 Mar 2019

mydata=rand(1,10)
color= ['r','g','b','k'];
figure, hold on
% % if data is more than colors then colors will be repeated
m = length(color);
for k = 1:length(mydata)
i = mod(k-1,m); %%i is remainder after division of k-1 by m
i = i+1;
h=bar(k,mydata(k));
set(h,'FaceColor',color(i));
end

  0 Comments

Sign in to comment.


Answer by Yaser Khojah 4 minutes ago

how would you show the legend color here?

  0 Comments

Sign in to comment.