How do I change the colors in a legend on a bar plot when I change the colors of the bars?
Mostra commenti meno recenti
I am having some problems with adapting a legend to a bar plot.
I have changed the colors of the bars, but when creating the legend I just have the option of putting one. When I put more entries I get the message
'Ignoring extra legend entries'
I have found in some other posts a way of putting more extra legends, but the problem is that they all have the same color and I have not found the way to change that!
Here is an example of what I mean:
data = rand(1,12);
def2=3:5;
def3=6:9;
def4=10:12;
index = ones(1,length(data));
index(def2)=2;
index(def3)=3;
index(def4)=4;
bar_h=bar(data);
bar_child=get(bar_h,'Children');
mycolor=[0 1 0;0 0 1;1 0 0;0 1 1];
set(bar_child, 'CData',index);
colormap(mycolor);
In this way I have the bars in the different colors I want. Now I would like to have a legend with four entries specifying the four different colors and the legend (for example) 'a','b','c','d'...
What I have found in other posts is:
ch=repmat(bar_child,1,4);
le={'a','b','c','d'};
legend(ch,le);
But I just get the same color in all the entries!
2 Commenti
Todd Flanagan
il 20 Gen 2011
Ana, I moved your reply to Walter into a comment to his answer.
Ana
il 22 Gen 2011
Risposta accettata
Più risposte (2)
Doug Hull
il 20 Gen 2011
The ability to change the color in each bar of a plot is not built into MATLAB.
As a workaround, you can return handles to the patch objects that define the bars, and change their colors using Handle Graphics. If you are using MATLAB 7.0 (R14) or later, you will need to use the 'v6' option to the BAR function to obtain handles to patch objects. In earlier versions, this is not necessary.
Y=[ 1 2 3 ; 4 5 6 ; 3 4 5];
h = bar('v6',Y);
set(h(1),'facecolor','red') % use color name
set(h(2),'facecolor',[0 1 0]) % or use RGB triple
set(h(3),'facecolor','b') % or use a color defined in the help for PLOT
Note: This would not have any effect on the legend colors. Hence you would need to change the legend colors similarly. You can get the handle of the legend and look for the children.
3 Commenti
Walter Roberson
il 22 Gen 2011
If you are using R14 or later, you do not need to use 'v6', but you do need to get the patches as children of the barseries hggroup object that is returned. barseries hggroup has at least one relevant property that is applied to all of the contained patches, overriding their corresponding property.
Ana
il 22 Gen 2011
Frank Schumann
il 1 Giu 2023
Mathworks, could you update your bar plot to make this possible in the future? It seems such an essential function to colour individual bars and put them on a legend.
These workaround, as happy as I am to find them, are so time consuming and error prone.
Haris
il 6 Apr 2012
I have found a way to display the bars with different colors. Let say that you have 4 measurements a, b, c and d that you want to display with different color each:
a = 1;
b = 2;
c = 3;
d = 4;
if you represent these values as
a2 = [ a 0 0 0 ];
b2 = [ 0 b 0 0 ];
c2 = [ 0 0 c 0 ];
d2 = [ 0 0 0 d ];
then you can display them with different colors:
figure;
set(gcf,'Color',[1,1,1]);
hold on;
bar(a2);
bar(b2,'g');
bar(c2,'r');
bar(d2,'y');
legend('a', 'b', 'c', 'd');
Categorie
Scopri di più su Legend in Centro assistenza e File Exchange
Prodotti
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!