Измените размер образца заполнения в легенде Matlab - PullRequest
3 голосов
/ 11 ноября 2010

Я создаю сюжет в Matlab, который включает в себя несколько строк, а также заливку.Например,

fill([0 1 1], [0 1 0], [.9 .9 .9]);
plot(rand(5, 1), 'b');
plot(rand(5, 1), 'r');
plot(rand(5, 1), 'g');
legend('fill', 'line one', 'line two', 'line three');

Я могу изменить длину строк образца в легенде с помощью:

f = findobj('type', 'line');
set(f(2), 'XData', [.2, .3]); % Changes line three
set(f(4), 'XData', [.2, .3]); % Changes line two
set(f(6), 'XData', [.2, .3]); % Changes line one

Но этот метод, похоже, не работает для заливки.Как изменить размер образца заполнения в легенде?

Ответы [ 2 ]

4 голосов
/ 11 ноября 2010
fill([0 1 1], [0 1 0], [.9 .9 .9]); hold on
plot(rand(5, 1), 'b');
plot(rand(5, 1), 'r');
plot(rand(5, 1), 'g'); hold off
h = legend('fill', 'line one', 'line two', 'line three');

%# find handles of lines inside legend that have a non-empty tag
hLegendLines = findobj(h, 'type', 'line', '-and', '-regexp','Tag','[^'']');
set(hLegendLines, 'XData', [.2, .3])

%# find handle of patch inside legend
hLegendPatch = findobj(h, 'type', 'patch');
set(hLegendPatch, 'XData', [.2, .2, .3, .3])

РЕДАКТИРОВАТЬ : (ответ на комментарии)

Вы можете управлять размером легенды, установив свойство Position. Тем не менее, кажется, что легенда подходит к своему содержанию настолько плотно, насколько это возможно по умолчанию, поэтому вы можете сделать его больше, но не меньше (попробуйте изменить размер с помощью мыши):

p = get(h,'Position'); p(3)=0.1;
set(h, 'Position',p);

alt text

Другой способ - уменьшить размер шрифта, используемого для надписей:

h = legend('fill', 'line one', 'line two', 'line three')
set(h, 'FontSize',6);    %# do this before changing the other stuff

alt text

1 голос
/ 02 июля 2015

Начиная с MATLAB R2014b и выше (новый графический движок "HG2") легенды реализованы по-разному, и графические объекты, найденные с использованием исходного ответа, больше не существуют.

Похоже, что "предварительный просмотр" теперьLegendIcon объекты, доступные как свойство Icon объекта LegendEntry для каждой записи в легенде.Объекты LegendEntry спрятаны как дочерние элементы скрытого свойства объекта Legend с именем EntryContainer.

Объекты LegendIcon имеют свойство Transform, которое, похоже, контролирует размерпредмета в них.Чтобы уменьшить ширину, измените первый элемент свойства Matrix, который определяет масштабирование по оси X преобразования.

Например, чтобы сделать все записи в два раза меньше, это выглядит примерно так::

hLegend = findobj('Type','legend');
entries = hLegend.EntryContainer.Children;
for entry = entries'
    entry.Icon.Transform.Matrix(1) = entry.Icon.Transform.Matrix(1) / 2;
end

Обратите внимание, что, как и раньше, сама легенда не сужается.Если вы попытаетесь изменить размеры легенды после изменения преобразования значков, даже чтобы увеличить легенду, преобразование, похоже, сбрасывается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...