Matlab条形图:更改条形图的颜色以及条形图和轴之间的间距

时间:2017-08-08 12:16:15

标签: matlab charts bar-chart matlab-figure

我有一个棘手的问题,我认为不能简单回答。

我有一个大型数据表,想要为每两个相应的平均值保存条形图。我已经用" for loop"做了那个,但我不能为我的条设置不同的颜色,也不能在条和轴之间设置适当的空格。

这是最简单的例子:

k = [2 5]
bar(k)

Two bars on one plot

Matlab认为这些数据[2 5]关于一个"组"并且它不会仅为一个条形改变颜色。

当然,当我们有不同的"组"时,颜色是可以改变的。

y = bar([1 2 3; 4 5 6]);
y(2).FaceColor = 'red';

但是我的例子怎么样?我只需要两个吧,我需要对它们进行不同的着色。另外,我想在每个条和轴之间设置一个小空间(再用两个条形图就不那么简单了,我不能使用"条形宽度"因为那不能给我什么我真的很想。)

有谁知道怎么解决这个问题?

感谢您的回复! 玛丽

4 个答案:

答案 0 :(得分:0)

一个好方法可能是为每个组添加零列:

k = [2 5;0 0];
bar(k,'grouped')

更新

另一种具有不同颜色的解决方案可能是使用bar中的位置:

k = [2 5];
figure(1);
hold on;
h=bar(1,k(1));
set(h,'FaceColor','k');
h=bar(2,k(2));
set(h,'FaceColor','b');
hold off

答案 1 :(得分:0)

据我所知,这需要使用自定义条形图,因为Matlab的条形图使用动态色彩映射。就个人而言,我喜欢所有这些自定义项的GRAMM工具箱:[GRAMM on file-exchange] [GRAMM on github]

以下是一个例子:

Bar width

x = [1 2];
y = [1 1.5];
c = x;
custom_map = ...
[1 0.3673 0.4132;
 0 0.7375 0.8344];

clear g
g(1,1)=gramm('x',x,'y',y,'color',c);
g(1,1).geom_bar('width',0.2);
g(1,1).set_title('Width = 0.2');

g(1,2)=gramm('x',x,'y',y,'color',c);
g(1,2).geom_bar('width',0.8);
g(1,2).set_title('Width = 0.8');

g.set_names('y','','x','');
g.set_color_options('map',custom_map);
g.axe_property('YTick',[],'LineWidth',1,'YColor',[1 1 1],'XLim',[0.5 2.5],'XTick',[1 2])

figure('Position',[100 100 600 300]);
g.draw();

答案 2 :(得分:0)

这是一个解决此问题的选项。您可以使用diag(k)创建一个2 * 2矩阵,除了与您的值一起使用的主对角线之外的所有零,并且Matlab将其读作2个不同的组。然后,您更改了“假人”的Xdata。条形图(你不会看到但是在x轴上占用一些空间到nan,所以Matlab会忽略它。

k = [2 5];
b = bar(diag(k));
set(b,{'XData'},{[1 nan],[nan 1]}); % remove the group you don't want
set(gca,{'xticklabel','XTick'},{{'ONE','TWO'},[0.85 1.15]});
b(2).FaceColor = 'r'; % choose a different color

结果:

enter image description here

如果你想把它概括为更多的群体(这里是5):

k = 1:5;
data = diag(k);
xdata = eye(numel(k))./eye(numel(k)); % a martix of nan with 1 on the main diagonal
b = bar(diag(k));
% remove all data except one bin in all groups:
set(b,{'XData'},mat2cell(xdata,ones(size(data,1),1),size(data,2)))
X = xlim; 5 get x-axis limits
w = (1-X(1))/(numel(k)/2); % calculate the width of one bin
set(gca,'XTick',X(1)+w/2:w:X(2)) % set the X ticks to the center of the bins
set(gca,'xticklabel',{'ONE','TWO','THREE','FOUR','FIVE'}); % set the labels
set(b,{'FaceColor'},mat2cell(lines(numel(k)),ones(size(data,1),1),3)); % set the colors

你得到:

enter image description here

最后,如果你想让他们“徘徊”'稍微高于x轴,您可以添加以下行:

b(1).BaseLine.Color = 'none'; % remove the base line
ylim([-0.1 max(k(:))]) % shift the bars up a little

并获得:

enter image description here

答案 3 :(得分:0)

histogram功能是一个可以轻松处理间距和x轴标记的选项,但您必须分别绘制每个条形图以独立控制颜色:

k = [2 5];
histogram('Categories', {'ONE'}, 'BinCounts', k(1), 'BarWidth', 0.8, ...
          'FaceAlpha', 1, 'FaceColor', [0 0.4470 0.7410]);
hold on;
histogram('Categories', {'TWO'}, 'BinCounts', k(2), 'BarWidth', 0.8, ...
          'FaceAlpha', 1, 'FaceColor', [0.8500 0.3250 0.0980]);

enter image description here