# Editing colors in the legend

2,093 views (last 30 days)
Rainer on 8 Jul 2015
Edited: Joseph Cheng on 1 Jun 2021
The following plots 2 data sets nicely. But the colors in the legend are wrong. Is there a way to change the colors in the legend? Thanks a lot.
dataset1=rand(10,3);
dataset2=rand(10,4)*100;
hold on
plot(dataset1,'color','b')
plot(dataset2,'color','r')
legend('DATASET1', ' DATASET2')

Thorsten on 9 Jul 2015
Edited: Walter Roberson on 13 Oct 2015
You can create each plot with a handle hi, of which you store only the first entry in h. Now you can use this handle h as the first argument of your legend function. This is basically Mike Garrity's solution with a for-loop to make it more suitable for larger number of data sets:
col = rand(4,3);
for i = 1:4, X{i} = rand(10-i, 10)*2^i; end
clear h
for i = 1:4
hi = plot(X{i}, 'Color', col(i,:));
h(i) = hi(1);
if i == 1, hold on, end,
end
legend(h, {'Dataset 1' 'Dataset 2' 'Dataset 3' 'Dataset 4'})
Image Analyst on 29 Jan 2019
We can't run this snippet. You didn't specify distinguishable_colors, donuts, donutsShelves, and data.
And you didn't include a screenshot to help us visualize your problem.
I have absolutely NO idea what your problem is, much less how to solve it.

Image Analyst on 8 Jul 2015
You're plotting 20 rows of data, yet you're only passing in 2 legend strings. So it takes the colors of those two from the first two that you plotted, which were in blue color. To fix, it's probably easiest to just plot each row one at a time.
dataset1=rand(10,3);
dataset2=rand(10,4)*10;
for row = 1 : size(dataset1, 1)
plot(dataset1(row, :),'bd-')
hold on
plot(dataset2(row, :), 'ro-')
end
legend('DATASET1', ' DATASET2') Mike Garrity on 9 Jul 2015
Another simple variant of this would be to give legend the handles of the objects you want it to use:
dataset1=rand(10,3);
dataset2=rand(10,4)*100;
hold on
h1 = plot(dataset1,'color','b')
h2 = plot(dataset2,'color','r')
legend([h1(1), h2(1)], 'DATASET1', ' DATASET2')
This is telling legend that you want one entry for the first item from the first call to plot (i.e. h1(1)) and another entry for the first item from the second call to plot (i.e. h2(1)). Does that make sense?

Joseph Cheng on 8 Jul 2015
Edited: Joseph Cheng on 1 Jun 2021
********************************************
not working past version 2014a
********************************************
well... you can adjust the handles of the legend through something like this
dataset1=rand(10,3);
dataset2=rand(10,4)*100;
hold on
plot(dataset1,'color','b')
plot(dataset2,'color','r')
hleg = legend('DATASET1', 'DATASET2');
chleg = get(hleg,'children')
set(chleg(1),'color','r')
set(chleg(2),'color','g')
set(chleg(3),'color','y')
set(chleg(4),'color','r')
set(chleg(5),'color','m')
set(chleg(6),'color','c')
I chose to change all values to different colors so you can see how the children are formed. i used to know why there are 6 children but i can't seem to recall at the moment. However from trying you can see that the symbol for each entry is chleg(2) and chleg(5). Maybe its somewhere in my previous answers submissions. however just make sure you correctly change accordingly.
Joseph Cheng on 1 Jun 2021
definately, this appears to be more obfuscated in later versions (after 2014a). Even @Image Analyst your solution would be the better correct method which i'm surprised people still wouldn't have gone for especially read back through the posts it is the corrected runnable Answers. I originally put my 2cents in as for some reson i had to do my (2014a) method that for some reason or another that i can't remember wouldn't play nice with some proper foresight in programming the legends.
maybe i should just delete this input (circa 2015) or provide another update in another format of all the above current valid (as of 2021) solutions.
figure(1),clf,hold on;
clors = ['brgmk'];
mrks = [':.-*^'];
for ind = 1:5
hplt(ind) = plot(randi(10,10,1),[clors(ind) mrks(ind)]);
ltxt{ind} = ['legend text' num2str(ind)];
end
legend(hplt(1:2:end),ltxt(1:2:end)) 