Plot both global and local legend

4 次查看(过去 30 天)
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 个评论
Mike Buba
Mike Buba 2024-2-4
编辑:Mike Buba 2024-2-4
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?

请先登录,再进行评论。

采纳的回答

Benjamin Kraus
Benjamin Kraus 2024-2-4
编辑:Benjamin Kraus 2024-2-4
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";

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Legend 的更多信息

产品


版本

R2022a

Community Treasure Hunt

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

Start Hunting!

Translated by