MATLAB 如何绘制堆叠柱状图(stack)并更改所有子柱的颜色

希望做出来的图如下,即不同组的堆叠柱状图,并能调节每个子柱的颜色:
在这里插入图片描述
以下是我的思路:
第一步,学会绘制不同颜色子柱的堆叠柱状图:
在这里插入图片描述

figure(1)
X= [15.93,17.56;
    17.20,13.26;
    27.56,14.10;
    32.89,14.47];
hold on
color_matrix = [1,0,0                   %1号柱下部颜色
                1,0.38,0.27             %1号柱上部颜色
                1,0.84,0                %2号柱下部颜色
                1,1,0                   %2号柱上部颜色
                0.19,0.80,0.19          %3号柱下部颜色
                0.67,1,0.18             %3号柱上部颜色
                0,0,1                   %4号柱下部颜色
                0,0.75,1];              %4号柱上部颜色
%一个个添加柱子,用b记录,此时调用b(i)的facecolor就可以用来修改颜色               
for i = 1:4
    b = bar(i:i+1,[X(i,:);0,0],0.75,'stacked');  %0.75是柱形图的宽,可以更改
    set(b(1),'facecolor',color_matrix((i-1)*2+1,:))
    set(b(2),'facecolor',color_matrix((i-1)*2+2,:))
end
box on
set(gca,'XTick',[]);
set(gca,'XLim',[0 5]);
set(gca,'YLim',[0 55]);
ylabel('Percentage (%)') 
xlabel('Irrigation area') 
set(gca,'FontSize',15,'Fontname', 'Arial');

细心的读者应该会发现有一行代码比较怪:

b = bar(i:i+1,[X(i,:);0,0],0.75,'stacked');  %0.75是柱形图的宽,可以更改

本来说好一个个添加,为什么一次加两个,而且是加一个[0,0]进去??
原因在于,以第一个柱子(X(1,:) = [15.93,17.56])为例:如果我直接写

bar(1,X(1,:),0.75,'stacked');

得到的图会变成:
在这里插入图片描述
问题出在MATLAB将X(1,:) = [15.93,17.56]识别为两个组每组一个数,而不是一个组一组两个数,所以我人为添加一个[0,0]进去辅助识别,就变成了[15.93,17.56; 0,0]。反正是高度等于零的柱子,也不会显现在图上~

现在清楚了吧

第二步,学会绘制多组、不同颜色子柱的堆叠柱状图:
在这里插入图片描述

figure(3)
x1= [20.73,25.45,28.85,34.21,0];
x2= [33.4900,30.4600,41.6600,47.3600,0];
x3= [44.8400,46.95,48.72,52.6400,0];
Y= [x1,x2,x3];
hold on
color_matrix = [0,0,0
                0.4,0.4,0.4
                0.7,0.7,0.7
                0.9,0.9,0.9];                        
for i = 1:15
    if mod(i,5) == 1 
        b = bar(i,Y(i),0.75,'FaceColor',color_matrix(1,:),'EdgeColor',color_matrix(1,:));
    elseif mod(i,5) == 2 
        b = bar(i,Y(i),0.75,'FaceColor',color_matrix(2,:),'EdgeColor',color_matrix(1,:));  
    elseif mod(i,5) == 3 
        b = bar(i,Y(i),0.75,'FaceColor',color_matrix(3,:),'EdgeColor',color_matrix(1,:)); 
    elseif mod(i,5) == 4 
        b = bar(i,Y(i),0.75,'FaceColor',color_matrix(4,:),'EdgeColor',color_matrix(1,:)); 
    elseif mod(i,5) == 0 
        b = bar(i,Y(i),0.75,'FaceColor',color_matrix(4,:),'EdgeColor',color_matrix(1,:));
    end
end
box on
set(gca,'XTick',[]);
set(gca,'XLim',[0 15]);
set(gca,'YLim',[0 55]);
ylabel('Percentage (%)') 
set(gca,'FontSize',15,'Fontname', 'Arial');

color_matrix = [1,0,0                
                1,0.38,0.27         
                1,0.84,0           
                1,1,0              
                0.19,0.80,0.19 
                0.67,1,0.18     
                0,0,1          
                0,0.75,1]; 
X= [15.93,17.56;17.20,13.26;27.56,14.10;32.89,14.47];
for i = 1:4
    b = bar(i+5:i+6,[X(i,:);0,0],'stacked');
    set(b(1),'facecolor',color_matrix((i-1)*2+1,:))
    set(b(2),'facecolor',color_matrix((i-1)*2+2,:))
end

思路说来也简单:
仍然是一个个添加柱子,提前将想要颜色的RGB值存到矩阵中,比如我存到了color_matrix 中,四种灰色。为了有明显空位来标明不同组别,每到第五个或者能被五整除的柱子时,由于柱子高度是0,就会出现空位,这也是我为什么在x1 x2 x3都加了个0进去作为他们的第五元素。
现在就可以开始依次判定,根据位置赋予颜色
同时最后再给第6、7、8、9柱子的子柱赋上不同颜色,方法同第一步

Finish!
祝大家2020年元旦快乐!

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值