Как я могу автоматически отобразить легенду так, чтобы она касалась границы угла на графике Matlab (R 2019b)? - PullRequest
3 голосов
/ 29 февраля 2020

Я знаю, как использовать вход «Расположение» функции легенды, но ни одна из опций не помещает легенду прямо в угол, все они оставляют небольшое пространство между легендой и границей сюжетов. Я видел, что можно указать местоположение с помощью вектора, но я не понял, как это сделать. Любая помощь приветствуется.

1 Ответ

3 голосов
/ 29 февраля 2020

Stati c подхода

Вот способ сделать это. Я использую расположение легенды NorthEast в качестве примера. Для других позиций вы можете использовать аналогичные логи c (см. Ниже).

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]

Так что в в этом случае ширина легенды устанавливается в положение левой оси плюс ширина оси минус положение левой легенды; и аналогично для высоты легенды. Этот лог c работает для легенды в локации NorthEast. Для других локаций модификация должна быть очевидной.

Динамический c подход

Недостатком вышеупомянутого является то, что легенда перестанет выравниваться, если изменить размер фигуры. Чтобы оставалось выровненным при изменении размера фигуры , вы можете использовать свойство SizeChangedFcn фигуры, чтобы указать код, который автоматически выполняется при изменении размера фигуры (ResizeFcn также работает, но не рекомендуется ).

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

Пример:

enter image description here

...