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

35
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', '');

Изображение 548

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

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

Теги:
legend
plot

6 ответов

26
Лучший ответ

Просто сохраните нужные дескрипторы дескрипторов в переменной и передайте массив в 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

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

Изображение 6353

  • 2
    Обратите внимание, что при таком подходе, как только вы выключите легенду и включите ее снова через пользовательский интерфейс, все линии вернутся в легенду.
  • 0
    @Jonas спасибо за указание на это.
Показать ещё 2 комментария
30

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

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

Это даст мне тот же график, что и в ответе Eitan T.

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

  • 4
    +1 элегантное решение я использовал это.
  • 2
    Я тоже использовал этот, так как я использую динамически именованные кривые (прекрасно работает для построения стандартного отклонения, но скрывает их в легенде).
Показать ещё 1 комментарий
5

Начните с ваших переменных и запишите их:

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

Установка свойства 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')

предоставит вам следующее: Изображение 6354

EDIT: у Jonas было хорошее предложение в комментариях: Установка свойства DisplayName для hc следующим образом:

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

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

  • 2
    Я предлагаю установить свойство DisplayName дескрипторов линии, а не вызывать legend с именами, чтобы результат был таким же после включения / выключения легенды в графическом интерфейсе.
  • 0
    Спасибо @Jonas. Обновил мой ответ.
1

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

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 пробела, чтобы количество символов было согласованным.

1

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

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

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

plot(t,c,t,m,t,s)  % cosine and -sine are first and second curves
legend('cosine', '-sine')
0

Быстрый взлом в работе:

  • Вырезать все, что вы не хотите появляться в легенде
  • Применить легенду
  • Вставить
  • 0
    Пожалуйста, используйте четкое встроенное форматирование :)
  • 0
    Что вы имеете в виду под вырезать и вставить? Вы хотите переместить другие команды plot после команды legend ? Предоставьте фрагмент кода для демонстрации.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню