【问题标题】:Bar plot switch colors in MatlabMatlab中的条形图切换颜色
【发布时间】:2019-06-01 22:46:51
【问题描述】:

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

“拆分前总 EON”与“拆分后总 EON”

'Pre split pure EON' with 'Post split pure EON'

“拆分前总 RWE”与“拆分后总 RWE”

“拆分前纯 RWE”与“拆分后纯 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

【问题讨论】:

  • "...names(1) 的颜色应该用names(2) 切换,names(3) 应该用names(4)" 切换。我是说 ... !?请原谅我不明白这一点。
  • 现在应该很清楚了,请参阅编辑。
  • "'Pre split total EON' with 'Post split total EON'" .请原谅我再问一次,但为了清楚起见,您想切换这两个条的颜色吗?如,您希望Pre split total EON 应该是blue,而Post split total EON 应该是dark blue/purple。对吗?
  • 如果你使用别人的代码,请正确引用。在这种情况下,您帖子中的代码来自here
  • 您可以按所需顺序绘制它们,也可以按照bar 文档中的this section 中所述手动指定各个条形颜色。

标签: matlab plot colors matlab-figure


【解决方案1】:

我知道@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

【讨论】:

  • 根据thisCData 属性是最近添加的,仅在MATLAB R2017b 之后。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2018-04-04
    • 1970-01-01
    • 2018-10-28
    • 1970-01-01
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多