EBH*_*EBH 5 matlab legend matlab-figure
以下代码是我能找到的最简单、最完整且可验证的示例。我的真实情况要复杂得多:
x = 1:0.1:10;
y = sin(x);
subplot 211
plot(x,y)
[leg,att] = legend('show');
title(leg,'my title')
leg.Title.Visible = 'on';
subplot 212
plot(x,y)
leg = legend('show');
title(leg,'my title')
Run Code Online (Sandbox Code Playgroud)
这导致:
正如您可以清楚地看到的,上部图例标题有问题。不知何故,询问att图例的输出会干扰其标题。首先,由于某种原因,它使其不可见,但这已经在上面的代码中解决了。
主要问题在于它的位置 - 它似乎没有这样的属性,所以一旦设置我就无法移动它。
我在Undocumented Matlab中读到了这篇文章,我自己可以想到一些类似的技巧(比如使用text图例的位置),但是我的情况非常复杂,而且我已经配置了很多图例并且每个图中都有几个轴。因此,我更喜欢一个简单且有效的解决方案,它依赖于图例标题的原始功能。
我使用Matlab 2016a。
警告!这个答案使用了未记录的功能,结果在版本2016a和2017a上进行了测试,在其他版本中可能有所不同。
如果这也适用于其他版本的 Matlab,请在评论中告诉我。
在对传说中未记录的属性进行一些研究后,我找到了答案。对于问题中的问题,最直接的答案是将图例标题的位置设置回原来的位置。这可以通过图例标题的属性来完成Position,该属性是隐藏属性的一部分。NodeChildren
图例框实际上只是一个小轴对象,因此位置单位相对于轴框进行标准化。如果我们在创建图例后查看它,我们会得到:
[hleg,att] = legend('show');
title(hleg,'my title')
hleg.Title.NodeChildren.Position
ans =
0 0 0
Run Code Online (Sandbox Code Playgroud)
这就是我们在问题中看到图例的地方。现在我们可以使用以下命令将其移回正确的位置:
hleg.Title.NodeChildren.Position = [0.5 1.5 0];
Run Code Online (Sandbox Code Playgroud)
这里我把它放在水平轴的中心(x = 0.5),垂直轴(y = 1.5)的上方,深度轴是不相关的,所以它为零(z = 0):
如果您不介意图例会干扰数据的选项(例如您的图例位于数据轴之外),那么您可以在此停止。如果没有,请继续阅读...
我们可以将背景颜色设置为白色:
hleg.Title.NodeChildren.BackgroundColor = 'w';
Run Code Online (Sandbox Code Playgroud)
但它看起来不太好,因为背景仅用于文本框,并且与图例框不对齐。因此,我更喜欢放大图例框以包含标题,并将图例属性向下移动以腾出一些空间。这需要更多的努力(因为我们需要计算所有元素的正确位置),但可以通过以下方式完成:
x = 1:0.1:10;
plot(x,sin(x),x,cos(x))
[hleg,icons,plots] = legend('show');
title(hleg,'my title')
hleg.Title.Visible = 'on';
% the addition in height needed for the title:
title_hight = hleg.Position(4)/numel(plots);
hleg.Position([2 4]) = [hleg.Position(2)-title_hight hleg.Position(4)+title_hight];
% calculate new position for the elements in the legeng:
new_pos = fliplr(0.5/(numel(plots)+1):1/(numel(plots)+1):1);
hleg.Title.NodeChildren.Position = [0.5 new_pos(1) 0];
% set the text to the right position:
leg_txt = findobj(icons,'Type','Text');
txt_pos = cell2mat({leg_txt.Position}.');
txt_pos(:,2) = new_pos(2:end);
set(leg_txt,{'Position'},mat2cell(txt_pos,[1 1],3));
% set the icons to the right position:
leg_att = findobj(icons,'Type','Line');
set(leg_att,{'YData'},mat2cell(repmat(repelem(new_pos(2:end).',...
numel(plots)),1,2),ones(numel(plots)*2,1),2))
Run Code Online (Sandbox Code Playgroud)
上面的代码也适用于更多的单一数据系列,尽管我猜想在某些情况下这将无法给出正确的解决方案并且需要一些微调。