Matlab中的条形图切换颜色

Bar plot switch colors in Matlab

我在 Matlab 中有以下代码,它为我生成了一个有用的图。现在我想让情节与另一个情节在颜色方面具有可比性。出于这个原因,应该切换一些颜色:colors for...

'Pre split total EON' 与 'Post split total EON'

'Pre split pure EON' 与 'Post split pure EON'

'Pre split total RWE' 与 'Post split total RWE'

'Pre split pure RWE' 与 'Post split pure RWE'.

就是这样,但我不知道该怎么做,因为颜色是自动分配的...

clear all
close all

values = [4 1 11 2 3; 4 1 5 2 -10];
names = {'Pre split total EON' 'Post split total EON'...
    'Pre split pure EON' 'Post split pure EON' 'Post split Uniper';...
    'Pre split total RWE' 'Post split total RWE'...
    'Pre split pure RWE' 'Post split pure RWE' 'PostSplitInnogy'};
categories = {'EON','RWE'};
figure;
b = bar(values,'FaceColor','flat');
ticksList = b(1).XData+arrayfun(@(x)x.XOffset, b)';
xticks(ticksList(:))
xticklabels([names(1,:)';names(2,:)'])
xtickangle(90)
ax1 = gca;
ax2 = axes('Position', get(ax1, 'Position'),'Color', 'none');
set(ax2, 'XAxisLocation', 'top','YAxisLocation','Right');
set(ax2, 'XLim', get(ax1, 'XLim'),'YLim', get(ax1, 'YLim'));
set(ax2, 'YTick', []);
xticks(b(1).XData)
xticklabels(categories)
for k = 1:size(values,2) % for fancier colors.
    b(k).CData = k;
end

我觉得你手动分配了颜色:

for k = 1:size(values,2) % for fancier colors.
    b(k).CData = k;
end

如果您只想更改顺序,可以通过

b(1).Cdata = 2;

等等。或者,您可以使用

进行全部更改
[b.CData] = deal(2,1,4,3,5);

我知道@Finn 已经回答了这个问题,但是当我测试他的解决方案时,我无法让它工作。奇怪的是,我意识到即使是原始脚本也会在我的系统上出现错误。可能是因为我有一个非常古老的 MATLAB 版本。不过话又说回来,我想知道是否其他人也有这个问题。

出于某种原因,我无法为 bar 设置 CData 成员。

无论如何,经过测试,我得到了这个对我有用。

clc
clear all
close all

values = [4 1 11 2 3; 4 1 5 2 -10];
names = {'Pre split total EON' 'Post split total EON'...
    'Pre split pure EON' 'Post split pure EON' 'Post split Uniper';...
    'Pre split total RWE' 'Post split total RWE'...
    'Pre split pure RWE' 'Post split pure RWE' 'PostSplitInnogy'};
categories = {'EON','RWE'};
figure;
b = bar(values,'FaceColor','flat');

% only significant changes here
% ***********************************
col = ["r", "b", "y", "g", "cyan"];
for k = 1:size(values,2) % for fancier colors.
    set(b(k), "FaceColor", col(k));
end
% ***********************************

ticksList = b(1).XData + arrayfun(@(x)x.XOffset, b)';
xticks(ticksList(:))
xticklabels([names(1,:)';names(2,:)'])
xtickangle(90)
ax1 = gca;
ax2 = axes('Position', get(ax1, 'Position'),'Color', 'none');
set(ax2, 'XAxisLocation', 'top','YAxisLocation','Right');
set(ax2, 'XLim', get(ax1, 'XLim'),'YLim', get(ax1, 'YLim'));
set(ax2, 'YTick', []);
xticks(b(1).XData)
xticklabels(categories)

如果您想了解更多有关颜色在 MATLAB 中如何分配名称的信息,请查看 here

您可以尝试的另一件事是按照 here 的说明设置 colormap