Мне нравится выводить две группы на печать строк в том же графике. У каждой группы есть две строки с тем же цветом, и я должен потянуть их в порядке одной группы после другой группы. Я пытаюсь показать легенду для групп только не для строк. Как я могу сделать это? Вот упрощение моего неверного кода:
plot(x1, y1, color1); hold on;
plot(x2, y2, color1); hold on;
plot(x3, y3, color2); hold on;
plot(x4, y4, color2); hold on;
legend({color1, color2})
Спасибо!
ОБНОВЛЕНИЕ:
Новый вопрос, там какой-либо способ записать легенду после каждой строки и не перезаписывая предыдущую легенду, но добавить к нему? т.е. что-то подобное для "держаний", но относилось к легенде.
Есть несколько способов сделать это. Самый простой способ - получить хэндл для первой построенной строки каждой группы и передать его в качестве первого аргумента в LEGEND:
h1 = plot(x1, y1, color1);
hold on;
plot(x2, y2, color1);
h2 = plot(x3, y3, color2);
plot(x4, y4, color2);
legend([h1 h2],{'label1', 'label2'});
Re: ваше обновление:
Чтобы обновить легенду, нужно заменить все на "legend(names)" еще раз. Вы можете использовать четвертый аргумент геттерной формы legend() для определения текущих имен, а затем просто добавить свой. (Это предполагает, что все строки в заговоре были добавлены, используя что-то, что инкрементно обновляет легенду таким образом.)
[~,~,~,names] = legend;
legend([names {'my new line name'}]);
Другой способ - отследить имена строк, используя их свойство DisplayName, а затем перестроить легенду, основываясь на текущем состоянии заговора, когда вы добавляете что-то новое. DisplayName - это то, что используется функцией legend() для автоматической генерации имён строк, когда вы вызываете простую форму "legend show". IMHO это немного приятнее в том, что легенда действует как вид текущего состояния графика, а не требует от вызывающих ее абонентов синхронизации.
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'));
Вы можете сшивать несколько строк вместе с помощью NaN, что означает "взять ручку". Тогда легенда будет рассматривать каждую как единый набор данных.
hold on
plot([x1 NaN x2], [y1 NaN y2], 'b');
plot([x3 NaN x4], [y3 NaN y4], 'r');
legend({'foo', 'bar'})
hold off
Для удобства, вы можете приклеить это в многострочной версии сюжета.
plot([x1 NaN x2], [y1 NaN y2], 'b', [x3 NaN x4], [y3 NaN y4], 'r');
Это может позволить вам установить свойства() для сгруппированных линий как единицы измерения.