如何自动显示图例,使其触及 Matlab (R 2019b) 图中角的边界?

How can I automatically display a legend so that it touches the border of a corner in a Matlab (R 2019b) plot?

我知道如何使用图例函数的 'Location' 输入,但是 none 的选项将图例放在角落里,它们之间都留有一个小的 space情节的传说和边界。我已经看到可以用矢量指定位置,但我不知道该怎么做。任何帮助表示赞赏。

静态方法

这是一种方法。我以 NorthEast 图例位置为例。对于其他职位,您可以使用类似的逻辑(见下文)。

plot([2 -2]) % example plot...
le = legend('abc', 'Location', 'northeast'); % ... with legend

pos_le = get(le, 'position');
pos_ax = get(gca, 'position');
set(le, 'position', [pos_le(1) pos_le(2) pos_ax(1)+pos_ax(3)-pos_le(1) pos_ax(2)+pos_ax(4)-pos_le(2)]); % new position

要了解其工作原理,请注意位置属性定义为

[lower_pos, left_pos, width, height]

所以在这种情况下,图例宽度设置为轴左侧位置加上轴宽度减去图例左侧位置;图例高度也类似。此逻辑适用于 NorthEast 位置的图例。对于其他位置,修改应该很明显。

动态方法

上述的一个缺点是,如果调整图形大小,图例将停止对齐。要在图形大小更改时保持对齐,您可以使用图形的 SizeChangedFcn 属性 来指定在图形调整大小时自动执行的代码(ResizeFcn 也有效,但它是 not recommended).

plot([2 -2]) % example plot...
le = legend('abc', 'Location', 'northeast'); % ... with legend

set(gcf, 'SizeChangedFcn', 'le = findobj(gcf, ''type'', ''legend''); pos_le = get(le, ''position''); pos_ax = get(gca, ''position''); set(le, ''position'', [pos_le(1) pos_le(2) pos_ax(1)+pos_ax(3)-pos_le(1) pos_ax(2)+pos_ax(4)-pos_le(2)]);')

set(gcf, 'position', get(gcf, 'position')-1e-3) % force initial call to SizeChangedFcn
set(gcf, 'position', get(gcf, 'position')+1e-3) % restore initial position

示例: