Подтвердить что ты не робот

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

Я запустил

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

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

Как вы можете добавить легенду из одного script?

4b9b3361

Ответ 1

Другой возможный способ сделать это и называется "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

ИЗМЕНИТЬ

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

Ответ 2

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

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');, как предлагает комментарий в комментарии Eugenio.

Ответ 3

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

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

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

Ответ 4

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

Начальные команды (верхняя часть моей основной)

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 и перезаписываю его новыми созданными мной графиками. Таким образом, на второй итерации будет выстроен график со второй итерации, график с 1-го будет удален, и после этих операций я получу его для отображения графика (снова drawnow).

Ответ 5

plot(x,y);
legend('y');

hold on;
plot(x,z);
hold off;

% Now add a new item to the legend

h = legend();
newleg = h.String;
newleg{end+1} = 'z';
legend(newleg);