# how to change order of legends?

1,157 views (last 30 days)
Mr M. on 23 Sep 2015
I dont want to change the order of my plots, but I want to change the order in the legend list. How to do?

David on 10 Jan 2018
Edited: David on 10 Jan 2018
I think Mr. M means the following: In the figure GUI, after one has worked hard to generate a nice figure by combining the outputs of various scripts via copy + paste, how can one change the order of the legend?
In earlier versions of MATLAB, one could achieve this by cutting and repasting traces. They would then reappear at the bottom of the legend. So you would take the trace you want to be second, cut and paste it, then do the same for the third, all the way to the Nth, and then the legend would have the desired order. Now it is no longer possible to do this. The figure somehow remembers the position of the trace before it was cut.
But there is a WORK-AROUND! Simply cut the trace, paste it in onto a different axis of a different figure, then cut that trace and paste it back onto the original figure. This stymies matlab's attempt to remember the order of the trace and puts it onto the bottom of the legend.
Walter Roberson on 19 Aug 2019

Rick on 24 Mar 2018
use this code to swap the order of two plots:
plots=get(gca, 'Children');
legend(plots(2, 1), {'Second line', 'First line'});
##### 2 CommentsShowHide 1 older comment
Gopinath Karuppannan on 29 Oct 2021
By using the above code, the order of the legends (only strings) are varying but the colors are not varied.

Liwei Wang on 25 Jan 2019
Cut+paste is a good idea. But sometimes it won't work because the plots are pretty close to each other. An alternative approach is to change the order of the plots by code:
Here is the copy of the code:
figure
scatter(rand(150,1),rand(150,1))
hold on
fill([0.2 0.5 0.5 0.2],[0.2 0.2 0.5 0.5],'r')
hg = line([0 0.6],[0.6 0]);
set(hg,'LineWidth',12,'Color','g')
h = get(gca,'Children');
set(gca,'Children',[h(3) h(2) h(1)])
Refresh legend then you will see the change.
Giorgia Calisti on 9 Jun 2020
Exactly what I was looking for!
Thank you

Ed Rawi on 22 Oct 2018
Edited: Ed Rawi on 23 Oct 2018
a = linspace(1,10,10);
b1 = sin(a);
Plot1 = plot(a,b1);
hold on
b2 = cos(a);
Plot2 = plot(a,b2);
hold off
legend([plot2 plot1],{Second,First})
##### 2 CommentsShowHide 1 older comment
MCH on 16 Dec 2020
@Ed: This solution works great

Kris Govertsen on 15 Jan 2021
This is how I was able to change the order of the legend on a figure with multiple subplots of area plots:
Before: I want the order of the legend to follow the order of the colors in the area plot
% a is my figure
% If I type
If I type the following into the command window: a.Children... it returns:
% a.Children
%
% ans =
%
% 5×1 graphics array:
%
% Legend (Grid, VRFB error, VRFB Power, VRFB Energy, LIB error, LIB Power, LIB Energy, Solar, Tidal)
% Axes (Tidal RES)
% Axes (Solar PV RES)
% Axes (VRFB Cost)
% Axes (LIB Cost)
So a.Children(1) is my legend!
% Re-order Legend
lbl = a.Children(1).String; % Retrieve legend labels
numlbl = length(lbl); % Determine number of lables
order = sort(1:1:numlbl,'descend'); % Create array of label numbers in descending order
newlbl = lbl(order); % Create new labels in descending order
legend(findobj(a.Children(2),'Type','area'),newlbl) % Set the legend to follow the new labels hope this helps!
Jan Heinsoth on 22 Feb 2021
Nice, someone wanted to do the same as me. Thanks

Steven Lord on 22 Feb 2021
You can specify the handles in a particular order when you create the legend.
% Sample data
x = 0:360;
y1 = sind(x);
y2 = cosd(x);
y3 = tand(x);
% Set up axes
axis([0 360 -1 1])
hold on
% Create plots
h = gobjects(3, 1);
h(1) = plot(x, y1, 'DisplayName', 'sine');
h(2) = plot(x, y2, 'DisplayName', 'cosine');
h(3) = plot(x, y3, 'DisplayName', 'tangent');
% Create legend -- cosine first then sine and finally tangent
legend(h([2 1 3])) FM on 22 May 2018
There is a good solution in the `Update` section of this post on Stack Overflow: http://stackoverflow.com/a/39104494/3230708

George on 23 Sep 2015
Is this something you are after, the question is not clear
x=magic(2);
plot(x(:,1));
hold
plot(x(:,2),'r');
legend('Data1','Data2');
%blue = Data1
%red=Data2
to change that simple reverse the string order
legend('Data2','Data1');

sarmad a on 15 Mar 2018
@David: you really saved my time !! Thanks

Kris Govertsen on 15 Jan 2021
This is how I was able to change the order of the legend on a figure with multiple subplots of area plots:
Before: I want the order of the legend to follow the order of the colors in the area plot
% a is my figure
% If I type
If I type the following into the command window: a.Children... it returns:
% a.Children
%
% ans =
%
% 5×1 graphics array:
%
% Legend (Grid, VRFB error, VRFB Power, VRFB Energy, LIB error, LIB Power, LIB Energy, Solar, Tidal)
% Axes (Tidal RES)
% Axes (Solar PV RES)
% Axes (VRFB Cost)
% Axes (LIB Cost)
So a.Children(1) is my legend!
% Re-order Legend
lbl = a.Children(1).String; % Retrieve legend labels
numlbl = length(lbl); % Determine number of lables
order = sort(1:1:numlbl,'descend'); % Create array of label numbers in descending order
newlbl = lbl(order); % Create new labels in descending order
legend(findobj(a.Children(2),'Type','area'),newlbl) % Set the legend to follow the new labels hope this helps!