Filter löschen
Filter löschen

Plot both global and local legend

4 Ansichten (letzte 30 Tage)
Mike Buba
Mike Buba am 27 Jan. 2024
Kommentiert: Mike Buba am 5 Feb. 2024
In the tiledlayout, I am trying to plot both global and local legend.
X = rand(5);
Y = rand(5);
figure
tiledlayout(2,1);
nexttile
plot(X(1,:),Y(1,:), 'r'); hold on;
plot(X(2,:),Y(2,:), 'k'); hold on;
plot(X(3,:),Y(3,:), 'k--'); hold on;
legend('Reference', 'Location', 'NorthWest');
nexttile
plot(X(1,:),Y(1,:), 'r', 'HandleVisibility','off'); hold on;
plot(X(4,:),Y(4,:), 'k'); hold on;
plot(X(5,:),Y(5,:), 'k--'); hold on;
% legend('Reference', 'Location', 'NorthWest');
My_LGD = legend('Signal 1', 'Signal 2');
My_LGD.Orientation = "horizontal";
My_LGD.NumColumns = 4;
My_LGD.Layout.Tile = "South";
This is the minimal working example I am using. I want to have a global legend showing Signal 1 and Signal 2 and then a local legend to highlight the e.g., Reference signal.
I had to hide the first plot in the second plot 'HandleVisibility','off' so my global legend takes the second two signals. Otherwise, is shows red line next to Signal 1 and black solid line next to Signal 2.
This is what I get What I want
You can see in the second Figure, that local legend is in both plots (what I want), and in the first figure is what the code gives me.
  1 Kommentar
Mike Buba
Mike Buba am 4 Feb. 2024
Bearbeitet: Mike Buba am 4 Feb. 2024
If I slightly modify the code; add ax=axes('Position',get(gca,'Position'),'Visible','Off'); and assigned p1, p2, etc. to the each plot. the plotting the last legend is done as: My_LGD = legend(ax, [p2 p3], {'Signal 1', 'Signal 2'});
X = rand(5);
Y = rand(5);
figure
tiledlayout(2,1);
nexttile
p1 = plot(X(1,:),Y(1,:), 'r'); hold on;
p2 = plot(X(2,:),Y(2,:), 'k'); hold on;
p3 = plot(X(3,:),Y(3,:), 'k--'); hold on;
legend('Reference', 'Location', 'NorthWest');
nexttile
p1 = plot(X(1,:),Y(1,:), 'r'); hold on;
p4 = plot(X(4,:),Y(4,:), 'k'); hold on;
p6 = plot(X(5,:),Y(5,:), 'k--'); hold on;
legend('Reference', 'Location', 'NorthWest');
ax=axes('Position',get(gca,'Position'),'Visible','Off');
My_LGD = legend(ax, [p2 p3], {'Signal 1', 'Signal 2'});
My_LGD.Orientation = "horizontal";
My_LGD.NumColumns = 4;
My_LGD.Layout.Tile = "South";
However, the My_LGD.Layout.Tile = "South"; gives an error:
Property assignment is not allowed when the object is empty.
Use subscripted assignment to create an array element.
Error in test (line 20)
My_LGD.Layout.Tile = "South";
It seems I can't get a global legend to appear outside the plot. Anyone knows what to do?

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Benjamin Kraus
Benjamin Kraus am 4 Feb. 2024
Bearbeitet: Benjamin Kraus am 4 Feb. 2024
Your hidden axes (and global legend) needs to have the tiledlayout as a parent.
X = rand(5);
Y = rand(5);
figure
tcl = tiledlayout(2,1); % I added an output argument from tiledlayout here.
nexttile
p1 = plot(X(1,:),Y(1,:), 'r'); hold on;
p2 = plot(X(2,:),Y(2,:), 'k'); hold on;
p3 = plot(X(3,:),Y(3,:), 'k--'); hold on;
legend('Reference', 'Location', 'NorthWest');
nexttile
p1 = plot(X(1,:),Y(1,:), 'r'); hold on;
p4 = plot(X(4,:),Y(4,:), 'k'); hold on;
p6 = plot(X(5,:),Y(5,:), 'k--'); hold on;
legend('Reference', 'Location', 'NorthWest');
ax=axes(tcl,'Visible','Off'); % I modified this line to specify the parent and ignore position.
My_LGD = legend(ax, [p2 p3], {'Signal 1', 'Signal 2'});
My_LGD.Orientation = "horizontal";
My_LGD.NumColumns = 4;
My_LGD.Layout.Tile = "South";

Weitere Antworten (0)

Kategorien

Mehr zu 2-D and 3-D Plots finden Sie in Help Center und File Exchange

Produkte


Version

R2022a

Community Treasure Hunt

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

Start Hunting!

Translated by