How to reorder legend entries with plot children

131 visualizaciones (últimos 30 días)
Enoch23
Enoch23 el 29 de Oct. de 2019
Comentada: Ipek Gokulu el 16 de Sept. de 2023
Hello,
I have a loop creating some plots and on some of them I would like to change the order of the legend entries. I came across a method on StackOverflow, however, it doens't seem to work.
I tried the example in excaza 's answer without success.
When I type in lh.PlotChildren(neworder) I get
>> lh.PlotChildren(neworder)
ans =
4×1 Line array:
Line (y = 3*x)
Line (y = x)
Line (y = x.^2)
Line (y = 2*x)
which is the correct order. However, when assigning
>> lh.PlotChildren = lh.PlotChildren(neworder)
lh =
Legend (y = x, y = 2*x, y = 3*x, y = x.^2) with properties:
String: {'y = x' 'y = 2*x' 'y = 3*x' 'y = x.^2'}
Location: 'northeast'
Orientation: 'vertical'
FontSize: 9
Position: [0.7274 0.7282 0.1589 0.1726]
Units: 'normalized'
Show all properties
it doesn't work. Everything stays as is.
Am I missing something?
  1 comentario
Kyle Marquis
Kyle Marquis el 19 de Sept. de 2020
Also having the same problems, and the solution given by Sebastian Bomberg is not helpful. Did it work for you?Anyone else have a solution?

Iniciar sesión para comentar.

Respuestas (4)

Sebastian Bomberg
Sebastian Bomberg el 29 de Oct. de 2019
You can reorder the children of the axes:
ax = gca;
ax.Children = ax.Children(neworder);
  1 comentario
Kyle Marquis
Kyle Marquis el 19 de Sept. de 2020
I am having the same issues as Enoch23, and your "solution" has not helped. Are you able to show how this re-orders the legend as asked in the question?

Iniciar sesión para comentar.


Kyle Marquis
Kyle Marquis el 19 de Sept. de 2020
Editada: Kyle Marquis el 19 de Sept. de 2020
I found a solution that can be used to re-order legend entries without messing up the order in which they are plotted on top of each other (But it doesn't involve plot children). I found it from https://matplotlib.org/1.3.1/users/legend_guide.html , and it's really simple, all you need to do is call
legend([p2, p1], ["line 2", "line 1"])
with p1 being the line object created when you plot
p1 = plot(...)
and together with uistack, I am able to change which objects get plotted on top of which, but then reorder the legend so it makes sense. Example
uistack(psave_d,'top') % Brings certain line to front
legend([psave_a, psave_b, psave_g, psave_c, psave_d, psave_e, psave_f, psave_pde], ["k_y=0.000001 W/m/K","k_y=0.0001 W/m/K","k_y=0.001 W/m/K","k_y=0.01 W/m/K","k_y=0.1 W/m/K","k_y=1 W/m/K","k_y=10 W/m/K","Isothermal PDE Numerical Model"])
If anyone needs more detail, I can gladly provide it. Cheers

nt_ba
nt_ba el 10 de Jun. de 2022
I found the solution. Worked perfect for me!
So after you open the .fig file, point at the plot (or subplot) you want to make the change on the legends order.
Then,
ax = gca;
ax.Children % Here you will see the order of your legends. Suppose you have 5 different legends
ax.Children = [ax.Children(2) ax.Children(3) ax.Children(1) ax.Children(4) ax.Children(5)]; % Indicatively, this is how to reorder the legends
Don't forget after doing the aforementioned changes to delete the legend in the figure and insert it again.
Cheers!
  1 comentario
Ipek Gokulu
Ipek Gokulu el 16 de Sept. de 2023
I think this is the most convenient way to do it especially if you are working on a previously saved figure. Thank you!

Iniciar sesión para comentar.


Kris Govertsen
Kris Govertsen el 15 de En. de 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!

Productos


Versión

R2019a

Community Treasure Hunt

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

Start Hunting!

Translated by