Получите легенду прямо со сложенным барным сюжетом - PullRequest
0 голосов
/ 12 декабря 2018

Я хотел бы создать график, который содержит как линии (plot, stairs), так и бары (bar).Для plot и stairs я обычно использую свойство 'DisplayName' для генерации легенды.С составным bar сюжетом это, похоже, больше не работает.Рассмотрим это MWE:

x_max = 20;
results = [3 37 50; 7 27 25; 11 0 13; 18 45 0];
figure('Position', [470 430 1000 600]);
plot(0:x_max, polyval([3 1], 0:x_max), 'DisplayName', 'Production rate');
hold on; grid on;
bh = bar(results(:,1), results(:,2:3), 0.2, 'stacked', 'DisplayName', 'Fraction');
xlim([0 x_max]);
legend('Location', 'best');
set(gca, 'FontSize', 18);
hold off

, который производит этот график: enter image description here

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

bar(results(:,1), results(:,2:3), 0.2, 'stacked', 'DisplayName', 'Fraction1', 'Fraction2')
bar(results(:,1), results(:,2:3), 0.2, 'stacked', 'DisplayName', {'Fraction1', 'Fraction2'})

>>Error setting property 'DisplayName' of class 'Bar':
Value must be a character vector or string scalar.

Но если я сделаю

bh.get('DisplayName')

, я получу

ans =

  2×1 cell array

    {'getcolumn(Fraction,1)'}
    {'getcolumn(Fraction,2)'}

Что означает, что Matlab внутренне генерирует ячейкумассив для 'DisplayName', но не позволяет мне назначить один.Это терпит неудачу:

bh.set('DisplayName', {'Fraction1'; 'Fraction2'})

Я знаю, что мог бы редактировать массив ячеек записей легенды напрямую, но я предпочитаю 'DisplayName', так как записи легенды никогда не выходят из строя, когда я изменяю команды построения (илидобавить или удалить любой из них).Любое решение?

1 Ответ

0 голосов
/ 12 декабря 2018

В качестве быстрого обходного пути вы можете установить для каждого объекта бара DisplayName после создания.Посмотрите на это решение, которое основано на вашем примере:

Проблема, с которой вы столкнулись, заключается в том, что стек bar создает массив Bar (в данном случае 1x2).Вы не можете установить свойство DisplayName массива Bar, вам нужно установить свойство каждого Bar в массиве.

% Your example code, without trying to set bar display names
x_max = 20;
results = [3 37 50; 7 27 25; 11 0 13; 18 45 0];
figure('Position', [470 430 1000 600]);
plot(0:x_max, polyval([3 1], 0:x_max), 'DisplayName', 'Production rate');
hold on; grid on;
bh = bar(results(:,1), results(:,2:3), 0.2, 'stacked');
xlim([0 x_max]);
legend('Location', 'best');
set(gca, 'FontSize', 18);
hold off

% Set bar names
names = {'Fraction1'; 'Fraction2'};
for n = 1:numel(names)
    set( bh(n), 'DisplayName', names{n} );
end

Вы можете сделатьэто без цикла, за счет немного менее явного синтаксиса:

names = {'Fraction1'; 'Fraction2'};
[bh(:).DisplayName] = names{:};

plot

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...