使用堆叠的条形图正确获取图例

时间:2018-12-12 11:08:54

标签: matlab plot

我想生成一个包含线(plotstairs)和条(bar)的图。对于plotstairs,我通常使用'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 :(得分:3)

作为一种快速的解决方法,可以在创建后设置每个条形对象的DisplayName。 请参见以您的示例为基础的此解决方案:

您遇到的问题是堆叠的bar创建一个Bar数组(在本例中为1x2)。您无法设置DisplayName数组的Bar属性,需要设置数组{em>中的每个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