Как показать легенду только для определенного подмножества кривых на графике?

t = 0 : 0.01 : 2 * pi;
s = sin(t);
c = cos(t);
m = -sin(t);

hold on;
plot(t, s, 'r');
plot(t, c, 'b');
plot(t, m, 'g');
hold off;

legend('', 'cosine', '');

Сюжет

На моем графике есть несколько кривых. Я хочу отображать легенду только для некоторых из них. Как мне это сделать?

Например, как сделать так, чтобы на приведенном выше графике отображалась только легенда косинуса? Когда я вызываю функции legend() как legend('', 'cosine'); вместо добавления пустого третьего параметра, третья зеленая строка действительно удаляется из легенды. Но это не решает мою проблему, потому что нежелательная красная линия остается видимой.


person hkBattousai    schedule 03.12.2012    source источник


Ответы (6)


Просто сохраните нужные дескрипторы легенды в переменной и передайте массив legend. В вашем случае это будет только одно значение, например:

hold on;
plot(t, s, 'r');
h2 = plot(t, c, 'b');  % # Storing only the desired handle
plot(t, m, 'g');
hold off;

legend(h2, 'cosine');  % # Passing only the desired handle

Вы должны получить этот сюжет:

введите здесь описание изображения

person Eitan T    schedule 03.12.2012
comment
Обратите внимание, что при таком подходе, как только вы отключите легенду и снова включите ее через пользовательский интерфейс, все строки вернутся в легенду. - person Jonas; 04.12.2012
comment
PNG лучше подходит для такого изображения. - person Mechanical snail; 02.02.2013
comment
Примечание: это, по сути, то, что рекомендуется на mathworks.com/help/matlab/creating_plots/ - person Carl Witthoft; 05.11.2015

Мне не нравится хранить значения дескрипторов, это становится беспорядком, когда у меня много графиков в моих рисунках. Поэтому я нашел другое решение.

t = 0 : 0.01 : 2 * pi;
s = sin(t);
c = cos(t);
m = -sin(t);
hold on;
plot(t, s, 'r', 'HandleVisibility','off'); % Plotting and telling to hide legend handle
h2 = plot(t, c, 'b', 'DisplayName', 'cosine');  % Plotting and giving legend name
plot(t, m, 'g', 'HandleVisibility','off'); % Plotting and telling to hide legend handle

legend show  % Generating legend based on already submitted values

Это дает мне тот же график, что и в ответе Эйтана Т.

Следует отметить, что это повлияет и на другие функции Matlab, например, cla удалит только графики, упомянутые в легенде. Найдите HandleVisibility в документации Matlab, чтобы узнать больше об этом.

person Mixopteryx    schedule 18.11.2013
comment
использовал это тоже, так как я использую кривые с динамическими именами (отлично работает для построения стандартного отклонения, но прячет их в легенде). - person gaborous; 06.11.2014
comment
Лучшее решение, если вы хотите внести эти изменения непосредственно в пользовательский интерфейс. - person G. Führ; 02.08.2015

Давайте начнем с ваших переменных и построим их:

t = 0 : 0.01 : 2 * pi;
s = sin(t);
c = cos(t);
m = -sin(t);

figure;
hold ('all');
hs = plot(t, s);
hc = plot(t, c);
hm = plot(t, m);

Существует свойство под названием IconDisplayStyle. Он зарыт достаточно глубоко. Путь, по которому вам нужно следовать, следующий:

Строка -> Аннотация -> Информация об легенде -> Стиль отображения значков

Установка свойства IconDisplayStyle off позволит вам пропустить эту строку. В качестве примера я отключу легенду hs.

hsAnno = get(hs, 'Annotation');
hsLegend = get(hsAnno, 'LegendInformation');
set(hsLegend, 'IconDisplayStyle', 'off');

Конечно, вы можете пойти дальше и сделать это следующим образом:

set(get(get(hs, 'Annotation'), 'LegendInformation'), 'IconDisplayStyle', 'off');

Но мне гораздо труднее понять.

Теперь функция legend просто пропустит hs.

Завершая мой код следующим образом:

legend('cosine', 'repeat for this handle')

даст вам это: введите здесь описание изображения

РЕДАКТИРОВАТЬ: У Джонаса было хорошее предложение в комментариях: установить свойство DisplayName hc следующим образом:

set(hc, 'DisplayName', 'cosine');
legend(gca, 'show');

даст вам легенду вам нужно. Вы свяжете свой дескриптор строки с 'cosine'. Итак, вы можете просто вызвать легенду с параметрами 'off' или 'show'.

person HebeleHododo    schedule 03.12.2012
comment
Я предлагаю установить свойство DisplayName дескрипторов строк, а не вызывать legend с именами, чтобы результат был таким же после включения/выключения легенды в графическом интерфейсе. - person Jonas; 04.12.2012
comment
Спасибо @Jonas. Обновил мой ответ. - person HebeleHododo; 04.12.2012

Вы можете просто изменить порядок построения кривых и применить легенду к первой кривой:

t = 0 : 0.01 : 2 * pi;
s = sin(t);
c = cos(t);
m = -sin(t);

plot(t,c,t,s,t,m)  % cosine is plotted FIRST
legend('cosine')   % legend for the FIRST element

если бы я хотел добавить легенду для косинуса и синуса:

plot(t,c,t,m,t,s)  % cosine and -sine are first and second curves
legend('cosine', '-sine')
person wese3112    schedule 05.07.2013

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

for ii=1:nBeams
    if X(ii)<0 %Bars with negative force are in compession
        h1=plot(linspace(beamCord(ii,1),beamCord(ii,3)),...
            linspace(beamCord(ii,2),beamCord(ii,4)),'r:');
    elseif X(ii)>0 %Bars with positive force are in tension
        h2=plot(linspace(beamCord(ii,1),beamCord(ii,3)),...
            linspace(beamCord(ii,2),beamCord(ii,4)),'b');
    end
end

legend([h1;h2],['Compression';'Tension    ']);

Где было добавлено 4 пробела после слова «Напряжение», чтобы количество символов было одинаковым.

person Jwhales    schedule 07.03.2014

Быстрый хак в сюжете:

  1. Вырежьте все, что вы не хотите, чтобы появилось в легенде
  2. Применить легенду
  3. Вставить
person KSmith    schedule 10.03.2017
comment
Что вы подразумеваете под вырезанием и вставкой? Вы имеете в виду переместить другие команды plot после команды legend? Предоставьте фрагмент кода для демонстрации. - person Cecilia; 10.03.2017