Re: ваше обновление:
Чтобы обновить легенду, вам нужно заменить все это, снова вызвав «легенду (имена)». Вы можете использовать четвертый аргумент геттерной формы legend(), чтобы определить текущие имена, а затем просто добавить свои. (Это предполагает, что все линии на графике были добавлены с помощью чего-то, что постепенно обновляет легенду таким образом.)
[~,~,~,names] = legend;
legend([names {'my new line name'}]);
Другой способ — отслеживать имена линий с помощью их свойства DisplayName, а затем перестраивать легенду на основе текущего состояния графика при добавлении чего-то нового. DisplayName — это то, что легенда() использует для автоматического создания имен строк, когда вы вызываете простую форму «показ легенды». ИМХО, это немного лучше, поскольку легенда действует как представление о текущем состоянии графика, а не требует от вызывающих абонентов синхронизировать их.
function repro_incremental_legend
%REPRO_INCREMENTAL_LEGEND Demonstrate plots with incrementally updated legend
figure; hold on
x = 1:5;
names = {'foo', 'bar', 'baz', 'qux'};
for i = 1:4
myplot(gca, x, x.*(1/i), names{i});
update_legend(gca);
pause(1); % remove in real code
end
function myplot(ax, x, y, name)
%MYPLOT Wrapper for plot() that respects ColorOrder and sets DisplayName
h = plot(ax, x, y); % plot before setting color so HOLD state is respected
set(h, 'DisplayName', name);
ColorOrder = get(ax, 'ColorOrder');
nLines = numel(get(ax, 'Children'));
set(h, 'Color', ColorOrder(1+mod(nLines-1, size(ColorOrder,1)),:));
function update_legend(ax)
%UPDATE_LEGEND Update legend based on current child lines
kids = get(ax, 'Children');
kids = kids(end:-1:1); % Legend seems to have the opposite ordering
legend(get(kids, 'DisplayName'));
person
Andrew Janke
schedule
27.01.2010