Добавление в легенду после каждой итерации

я бегу

loglog(x,y);
legend('First script');

из первого сценария. Затем hold on;. Я запускаю аналогичный второй скрипт. Я правильно вижу два графика, но только начальную легенду. Я хочу увеличить легенду из разных скриптов.

Как добавить легенду из одного скрипта?


person Léo Léopold Hertz 준영    schedule 17.10.2013    source источник
comment
Добавление записей в легенду невозможно, поэтому вы должны построить новую легенду, используя данные из текущей легенды. Возможное решение приведено здесь: mathworks.com/support/solutions/ ru/data/1-181SJ   -  person zroth    schedule 17.10.2013


Ответы (5)


Другой возможный способ сделать это называется «DisplayName»:

hold all
for ind=1:3
x=[0:0.1:10];
plot(x, sin(x)+ind, 'DisplayName',['sin + ' num2str(ind)]);
end
legend(gca,'show')

Просто используйте это свойство при построении графиков отовсюду до любых осей :)

Возможны и другие вещи, например, динамическая легенда!

Для получения дополнительной информации см. это: динамическая легенда из недокументированного Matlab

ИЗМЕНИТЬ

вы должны обновлять легенду после каждого запуска скрипта. вы можете сделать это с динамической легендой или просто с легендой('off'); легенда («шоу»)

person Lucius II.    schedule 17.10.2013
comment
Это удобная функция, но вы не получите легенду, пока не начертите все. -dynamicLegend с другой стороны, отличное решение, по крайней мере, в принципе. Надеюсь, MathWorks сможет исправить ошибки в этой последней функции (масштабирование выдает ошибки). - person chappjc; 17.10.2013
comment
@chappjc ну а по поводу ошибки при увеличении рекомендую почитать статью на недокументированном матлабе. Яир Альтман объясняет, как от этого избавиться :) Насчет появления легенды: я не понимаю, что вы имеете в виду, когда говорите, что легенда не появится, пока вы все не начертите. Возможно, вы имеете в виду, что он не обновляется автоматически. если кому-то это нужно, просто выключи и снова включи легенду... - person Lucius II.; 21.10.2013
comment
Это совершенно верно, и выключение и включение - это решение, которое я даю в своем ответе. ОП хочет запустить код, сгенерировав сюжет и легенду, посмотреть на него, запустить второй произвольный скрипт, посмотреть на него с обновленной легендой... (правильно?) вы не получите этого, если legend вызывается только после петля. DisplayName это хорошо, но это не то, что дает вам динамическую легенду, как того хочет OP - внутри цикла вам нужно legend('off');legend('show'); сразу после сюжета. Как мы знаем, это довольно тривиальное изменение, но это решение. В любом случае, было бы неплохо, если бы MATLAB просто предложил опцию 'auto' для легенды. :) - person chappjc; 21.10.2013
comment
@chappjc Я вижу! не понял такого вопроса ... Просто подумал, что ОП спрашивает о том, как поместить информацию в легенду. И для этого пригодятся DisplayName и массив строк. для обновления легенды возможны как легенда (выкл./вкл.), так и динамическая легенда. - person Lucius II.; 21.10.2013

Самый простой способ справиться с этим — сохранить дескриптор легенды при ее создании, а затем, когда вы будете готовы обновить график новой легендой с включенной другой серией, удалить легенду и создать новую:

legendStrings = {'First script'};
h_legend = legend(legendStrings{:});
% ... computations, hold on and additional plot on axis
delete(h_legend);
legendStrings{end+1} = 'Second script';
h_legend = legend(legendStrings{:});
% rinse and repeat...

Обычно с графическими объектами, такими как текстовое поле, я бы сказал, просто повторно используйте объект через дескриптор (не делайте delete). Однако если вы обновляете легенду, а не заменяете ее, вам придется беспокоиться не только о строках. решение MathWorks, на которое ссылается zroth, кажется, действительно решает этот подход. !

В качестве альтернативы delete и созданию нового вы также можете включать и выключать легенду с помощью legend('off'); legend('show');, как предлагает ответ в комментарии Эудженио.

person chappjc    schedule 17.10.2013
comment
Простой ответ, невозможен, доступен только обходной путь. Так намного проще, наконец, снова написать легенды. - person Léo Léopold Hertz 준영; 17.10.2013

Самый простой способ:

hold all;
p1=plot(1:10,1:10);  
legend(p1,'1');  % in this way plot(x,y) is saved as variable p1 with name '1'   
p2=plot(1:10,11:20); % different data set

legend(p2,'2');  
legend(gca,'off');    
legend('show');

Это соединение нескольких методов, оно очень простое и его можно использовать везде.

person gajun5    schedule 29.04.2015
comment
круто, +1. Что делает легенда (gca, 'off')? - person user3804598; 30.06.2017
comment
@user3804598 user3804598 Если вам все еще интересно, легенда (gca, 'off') связана со строкой непосредственно под ней. По сути, он отключает легенду (строка ниже включает ее снова), что заставляет Matlab обновляться и отображать новые изменения легенды. - person ntjess; 23.11.2019

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

Исходные команды (вверху моей основной)

close all гарантирует, что ваш сюжет каждый раз будет начинаться заново

Первый участок (в моем основном)

plot(points,expdata1,'ro','DisplayName','Experimental, L= 0.1 m'); hold on
plot(points,expdata2,'bo','DisplayName','Experimental, L= 0.2 m'); 
plot(points,expdata3,'go','DisplayName','Experimental, L= 0.3 m');   
legend('-DynamicLegend','Location','Best')
drawnow
h_old=plot(0,250);

drawnow заставляет график рисоваться сразу, а h_old — это просто «заполнитель», который я буду использовать позже. Я выбрал 0,250, потому что он находится в диапазоне данных (иначе он испортит ось).

Второй график (в вызываемой функции)

h(1)=plot(points,modeldata1,'r-','DisplayName','Model Data, L= 0.1 m');
h(2)=plot(points,modeldata2,'b-','DisplayName','Model Data, L= 0.2 m'); 
h(3)=plot(points,modeldata3,'g-','DisplayName','Model Data, L= 0.3 m');
delete(h_old);
h_old = h;
drawnow

Я удаляю h_old и перезаписываю его новыми сюжетами, которые я создал. Таким образом, на второй итерации будет построен график со 2-й итерации, график с 1-й будет удален, и после этих операций я получаю отображение графика (опять же drawnow).

person laureapresa    schedule 15.12.2014

person    schedule
comment
Хотя это может быть ответ, который ищет OP, вы должны предоставить объяснение в своем коде. просто вставка кода на самом деле не помогает ОП понять свои ошибки или ошибки и мало что делает для улучшения знаний будущих зрителей этого вопроса. - person leigero; 12.03.2015