基于MATLAB的条形图进阶绘制

基于MATLAB的条形图进阶绘制

在利用matlab绘制条形图时,特别是数据具有分组特征且颜色又需要任意赋值的时候,我们该如何绘制呢?如下面的示例:
在这里插入图片描述

可以看到,这组条形图被分为了3个大组,每个大组里面有5个变量。5个变量对应5种色彩。在不同对照组之间,同一变量均填充相同的色彩。我们还可以看到,每组的后两个图条是一个堆叠条形图,堆叠条形图的下半段又是同一种色彩。
我们知道,在利用matlab自带的bar函数可以绘制,绘制具有分组特征的条形图,也可以通过设置条形图样式为‘stacked’,即堆叠条形图。

图如:
在这里插入图片描述

x1= [ 8.336 5.693 2.322 14.040 20.198 0 ];
x2= [ 14.031 12.312 3.886 23.668 36.099 0 ];
x3= [ 18.529 21.234 5.081 31.020 46.002 0];
yt= [x1;x2;x3];
figure
subplot(211), bar(yt) %分组
subplot(212), bar(yt,'stacked') %堆叠

在这里插入图片描述

从图中可以看到,matlab默认的将每一组对应变量或是堆叠图的相同层填充成同一色彩。
然而,如何才能在同一张图中即有分组,又有堆叠图,颜色还可以任意替换呢?
单一地利用数据矩阵和bar函数是无法完成的,此时我们可以利用hold on 命令,在同一张图中一条一条地绘制条形图,并设置好相应的颜色,具体代码如下。

clc
clear 
close all
figure
x1= [ 8.336 5.693 2.322 14.040 20.198 0 ];
x2= [ 14.031 12.312 3.886 23.668 36.099 0 ];
x3= [ 18.529 21.234 5.081 31.020 46.002 0];
Y= [x1,x2,x3];
hold on
 
%色彩定义
c1=[0 0 0];
c2=[1 0 0];
c3=[0 0 1];
c4=[1 1 0];
c5=[1 0 1];
%c6=[0 1 1];
c6 =[0.5 0.5 0.5];
 
color_matrix = [c1; c2; c3; c4; c5; c6 ];
            
for i = 1:18
    if mod(i,6) == 1 
        b = bar(i,Y(i),0.75,'FaceColor',color_matrix(1,:),'EdgeColor',color_matrix(1,:));
    elseif mod(i,6) == 2 
        b = bar(i,Y(i),0.75,'FaceColor',color_matrix(2,:),'EdgeColor',color_matrix(1,:));  
    elseif mod(i,6) == 3 
        b = bar(i,Y(i),0.75,'FaceColor',color_matrix(3,:),'EdgeColor',color_matrix(1,:)); 
    elseif mod(i,6) == 4 
        b = bar(i,Y(i),0.75,'FaceColor',color_matrix(4,:),'EdgeColor',color_matrix(1,:)); 
    elseif mod(i,6) == 5 
        b = bar(i,Y(i),0.75,'FaceColor',color_matrix(5,:),'EdgeColor',color_matrix(1,:));
    elseif mod(i,6) == 6 
        b = bar(i,Y(i),0.75,'FaceColor',color_matrix(6,:),'EdgeColor',color_matrix(1,:));
    elseif mod(i,0) == 0 
        b = bar(i,Y(i),0.75,'FaceColor',color_matrix(6,:),'EdgeColor',color_matrix(1,:));
    end
end
 
color_matrix = [c1; c2; c3; c4; c5; c6];
X= [ 6.7,14.040;  
    12.5,20.198;
    11.3,23.668;
    22.7,36.099; 
    14.9,31.020; 
    28.5,46.002   ];
for j=0:2
    for i = 1:2
        b1 = bar(j*6+i+3:j*6+i+4,[X(j*2+i,:);0,0],'stacked');
        set(b1(1),'facecolor',c6)
        set(b1(2),'facecolor',color_matrix(3+i,:))
    end
end
xticks(0:1:21); %这样x轴会每隔10显示一个刻度
xticklabels({'','','','0.8','','',...
             '','','','1.2','','','',...
             '','','2.0',''});
         
legend('A','B','C','D','E');
ax1 = gca;
ax2 = axes( 'Position',get(ax1,'Position'),'Xlim',[-1 2],'Ylim',[-1 2],'Visible','off','color','none');
Leg1 = legend(ax1,'A','B','C','D','E');
Leg2 = legend( ax2,b1,'S' );

编程思路:
主要思想是利用bar函数逐条绘制,并填充相应色彩。将需要绘制的数据顺序排列,组与组间的间隔用0来隔开,即[5个数据 + 0]构成一组数据,然后用bar函数依次绘制,色彩填充则一句数据下标特征给予填充。在利用hold on 将对堆叠条形图,叠加并覆盖到图层中,堆叠图的色彩填充依旧是逐条逐层按下标特征填充。
运行结果如下:

在这里插入图片描述
需要说明的一点是,在绘制堆叠条形图时,对每一层的颜色填充的具体操作如下(文中堆叠层数为2层):

for j=0:2
    for i = 1:2
        b1 = bar(j*6+i+3:j*6+i+4,[X(j*2+i,:);0,0],'stacked');
        set(b1(1),'facecolor',c6)
        set(b1(2),'facecolor',color_matrix(3+i,:))
    end
end
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值