легенда для группы строк

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

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})

Спасибо!


ОБНОВЛЕНИЕ:

Новый вопрос, там какой-либо способ записать легенду после каждой строки и не перезаписывая предыдущую легенду, но добавить к нему? т.е. что-то подобное для "держаний", но относилось к легенде.

20
задан Tim 26 January 2010 в 18:22
поделиться

3 ответа

Есть несколько способов сделать это. Самый простой способ - получить хэндл для первой построенной строки каждой группы и передать его в качестве первого аргумента в 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'});
25
ответ дан 29 November 2019 в 23:20
поделиться

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'));
4
ответ дан 29 November 2019 в 23:20
поделиться

Вы можете сшивать несколько строк вместе с помощью 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');

Это может позволить вам установить свойства() для сгруппированных линий как единицы измерения.

11
ответ дан 29 November 2019 в 23:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: