# how to change order of legends?

949 views (last 30 days)

Show older comments

Mr M.
on 23 Sep 2015

Commented: Muhammad Tauha Ali
on 7 Apr 2024 at 10:58

##### 0 Comments

### Accepted Answer

Afiq Azaibi
on 29 Feb 2024

Edited: Afiq Azaibi
on 1 Mar 2024

Three ways to change the order of items in the legend

I'll review two ways to flexibly set the legend's order and one way to reverse the legend order.

Flexibly set the legend order:

Let's take this simple example:

figure;

ax = gca;

hold(ax, 'on')

p1 = plot(1:10, LineWidth=5, DisplayName='p1');

p2 = plot(10:-1:1, LineWidth=5, DisplayName='p2');

p3 = plot(ones(10,1)*5, LineWidth=5, DisplayName='p3');

1) The first way is to specify the order the object handles in the legend command. If we wanted p2 on top, p3 in the middle, and p1 on the bottom, we would call this:

legend([p2, p3, p1])

2) The second way you can do this is by updating the child order of the axes. By default, the legend will order the objects in the same order of creation. This is the reverse order of the axes’ Children property since the oldest object gets placed at the bottom:

ax.Children = [p1; p3; p2];

legend;

Note: Updating the order of the Children property will impact the stacking order of the objects in the axes. While you can achieve the same resulting legend as in the first approach, it will alter the appearance in the axes.

Reverse the legend order:

3) Starting in 23b, a new Direction property was added to legend. This property inverts the order of the legend entries. By default, the value of this property is 'normal'.

hold(ax, 'off')

p = plot([1:10; 2:11; 3:12; 4:13]', LineWidth=3);

l = legend;

l.Direction = 'reverse';

Some objects like a stacked bar and area have an inherent order. The legend will set Direction to 'reverse' automatically:

bar(magic(5), 'stacked');

legend;

area(magic(5));

legend;

You can revert back to the previous behavior by specifying the legend's direction to be 'normal'

legend(Direction='normal');

##### 1 Comment

### More Answers (10)

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.

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]))

##### 0 Comments

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'});

##### 5 Comments

Walter Roberson
on 28 Sep 2023

Smart
on 29 Sep 2023

Edited: Smart
on 29 Sep 2023

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 Comments

Jim Bosley
on 19 Aug 2019

Last line needs plot handles capitalized, as they were defined.

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’})

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.

##### 1 Comment

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!

##### 2 Comments

LIU
on 22 Mar 2022

Hi, I have a silimar problem, and guess your method could be useful for me. But I don't know how to apply your code suited to my case. Would you please kindly have a look at my problem and give me a hand? Thank you very much.

The link is :

FM
on 22 May 2018

##### 0 Comments

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');

see also this http://nl.mathworks.com/help/matlab/ref/legend.html and this http://nl.mathworks.com/help/matlab/ref/legend-properties.html For more information on handling the legends

##### 0 Comments

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!

##### 0 Comments

Sandeep A S V
on 7 Jan 2022

Edited: Sandeep A S V
on 7 Jan 2022

There is a simple solution using the property inspector GUI.

1.Go to Edit menu on the figure window

2. Select 'current object properties'

3. Select one of the plots in your figure

4. Change the property 'SeriesIndex' in COLOR AND STYLING tab.

##### 1 Comment

Muhammad Tauha Ali
on 7 Apr 2024 at 10:58

### See Also

### Categories

### Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!