Добавление к легенде после каждой итерации
Я запустил
loglog(x,y);
legend('First script');
из первого script.
Тогда hold on;
.
Я запускаю аналогичный второй script.
Я вижу два графика правильно, но только начальную легенду.
Я хочу увеличить легенду из разных сценариев.
Как вы можете добавить легенду из одного script?
Ответы
Ответ 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);