我想生成一个包含线(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
我想为两个分数中的每个分数(例如'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'
,因为当我更改绘图命令(或添加或删除其中任何一个)时,图例条目永远不会乱序。 。有解决办法吗?
答案 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{:};