在Matlab中为图例设置标题

在Matlab中为图例设置标题,matlab,matlab-figure,legend,Matlab,Matlab Figure,Legend,下面的代码是我能找到的最多的代码。我的真实情况要复杂得多: 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') 这导致: 正如您可以清楚地看到的,上面的图例标题有问

下面的代码是我能找到的最多的代码。我的真实情况要复杂得多:

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')
这导致:

正如您可以清楚地看到的,上面的图例标题有问题。不知何故,请求图例的
att
输出会干扰其标题。首先,出于某种原因,它使它不可见,但这在上面的代码中已经解决了

主要的问题是它的位置——它似乎没有这样的属性,所以一旦设置好,我就无法移动它

我自己读过,也能想到一些类似的破解(比如用
文本
来定位图例),但我的情况非常复杂,我已经配置了很多图例,每个图形中都有几个轴。因此,我更喜欢一个简单而有效的解决方案,它依赖于图例标题的原始功能


我使用Matlab2016a。

小心!此答案使用了未记录的功能,结果在版本2016a和2017a上进行了测试,在其他版本中可能有所不同。
请在评论中告诉我这是否也适用于其他版本的Matlab


经过对传说的一些研究,我找到了答案。问题中最直接的答案是将图例标题的位置设置回原来的位置。这可以通过属性
位置
完成,该属性是图例标题的隐藏属性
节点儿童
的一部分

图例框实际上只是一个小轴对象,因此位置单位相对于轴框进行规格化。如果我们在创造传奇之后再看它,我们会得到:

[hleg,att] = legend('show');
title(hleg,'my title')
hleg.Title.NodeChildren.Position

ans =
     0     0     0
这就是我们在问题中看到的传奇。现在,我们可以使用以下方法将其移回正确的位置:

hleg.Title.NodeChildren.Position = [0.5 1.5 0];
这里我把它放在水平轴的中心(x=0.5),垂直轴的上方(y=1.5),深度轴是不相关的,所以它是零(z=0):

如果您不介意图例会干扰数据的选项(例如,您的图例位于数据轴之外),则可以在此停止。如果没有,请继续阅读


我们可以将背景色设置为白色:

hleg.Title.NodeChildren.BackgroundColor = 'w';
但是它看起来不太好,因为背景只用于文本框,并且没有与图例框对齐。因此,我更喜欢放大图例框以包含标题,并向下移动图例属性以留出一些空间。这需要更多的努力(因为我们需要计算所有元素的正确位置),但可以通过以下方式完成:

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))
上面的代码也适用于更多的一个数据系列,尽管我猜在某些情况下,这将无法给出正确的解决方案,并且需要一些微调


您是否在中阅读了有关
[lgd,图标,绘图,txt]=图例(\uuuuuuuuuuuuuuuuuuuu)
重载的说明?注意:不建议使用此语法。它创建的图例不支持所有图形功能。相反,请使用
lgd=legend(_u)
语法返回图例对象并设置图例属性。@Cebri但我需要访问图标,以便根据需要操作图例。否则我如何更改它们的属性?正如您所写的,您最好使用带有图例位置的文本。如果需要多次创建函数,则可以创建函数。R2016b中也会出现这种情况