基于Matlab的统计图绘制(1)——直条图、百分条图、圆图(圆环图)

本文详细介绍了如何在Matlab中使用bar、barh和pie等函数绘制单式和复式直条图、百分条图以及圆图(饼图和圆环图),并展示了美化图形的各种技巧,包括颜色设置、柱形宽度、图例和标签的配置。
摘要由CSDN通过智能技术生成

一、绘制直条图

直条图分为单式和复式两种。单式适用于只有一组变量,复式适用于有若干组变量。

1.1 单式直条图

利用bar函数,绘制男女人数统计直条图。

% 单式直条图
x = {'男', '女'};
y = [10, 30];
bar(y);

ylim([0,40]); %y轴范围
set(gca, 'xticklabel', x); %设置x轴刻度标签
xlabel('性别'); %x轴名称
ylabel('人数'); %y轴名称
title('男女人数统计直条图'); %统计图名称

代码运行如下 

简单使用bar函数即可绘制直条图,但通常情况下需要对图形美化。本文只讲解如何美化单式条形图,后续同理美化即可。

1.2 美化单式直条图 

直条图柱形粗细的设置可以直接在bar函数后面加上系数,如bar(y,0.4)中0.4表示柱形宽度占总宽度的40%。

此外还可以设置颜色bar(y,'r'),表示设置为红色。具体颜色可以参考:https://ww2.mathworks.cn/help/matlab/creating_plots/specify-plot-colors_zh_CN.html

% 美化的单式直条图
x = {'男', '女'};
y = [10, 30];
bar(y,0.4,'r');

ylim([0,40]);
set(gca, 'xticklabel', x);
xlabel('性别');
ylabel('人数');
title('男女人数统计直条图');

代码运行如下  

此外,颜色柱形颜色、轮廓颜色、轮廓线粗细都可以调整分别加上‘FaceColor’,‘Edgecolor’,‘LineWidth’修饰即可,并且可以用rbg三原色设置,在后面加上[R,G,B]即可。

% 美化的单式直条图
x = {'男', '女'};
y = [10, 30];
bar(y,'FaceColor',[0 .7 .7],'EdgeColor',[.5 .2 .2],'LineWidth',1.5);

ylim([0,40]);
set(gca, 'xticklabel', x);
xlabel('性别');
ylabel('人数');
title('男女人数统计直条图');

代码运行如下  

 

 1.3 复式直条图

注意:

1. 单式直条图输入的y是一列的矩阵;而复式直条图,是两列或者更多列的矩阵

2. 复式需要legend函数设置图例。

% 复式直条图
x = {'近视眼','远视眼','肥胖'};
y = [0.4 0.6; 0.5 0.3;0.2 0.1];
bar(y)

ylim([0,1]);
set(gca, 'xticklabel', x);
ylabel('患病率');
legend('男','女')

代码运行如下  

 1.4 横向直条图

横向直条图同样包括单式和复式,在此以单式为例。利用barh函数绘制

需要注意的是:因为改变了x,y的位置,后续也同时需要更改xlim,set,xlabel,ylabel函数。

% 其他直条图
x = {'男', '女'};
y = [10, 30];
barh(y);

xlim([0,40]);
set(gca, 'yticklabel', x);
ylabel('性别');
xlabel('人数');
title('男女人数统计直条图');

代码运行如下  

二、百分条图

以长条面积为100%,用长条内隔断面积所占的百分比来表示各部分在全体中所占的比例。

2.1 单式百分条图

利用barh函数,具体思路如下:

- 首先计算各部分比例,如下代码利用了per = y / sum(y);计算比例
- 再绘制横向直条图

- 最后将直条图堆叠(‘stacked’)起来

注意:
1. 需要用set函数取消掉yticklabel

2. 需要用legend函数设置图例

% 单式百分条图
x = 1;
y = [40,20,10,30];
per = y/sum(y);
b = barh(x,per,'stacked');

set(gca,'yticklabel',[])
legend('大一','大二','大三','大四')

代码运行如下  

2.2 复式百分条图

具体思路:

- 计算各组比例,如下代码y已经算好

- 利用barh函数绘制复式横向直条图

- 将各组直条图堆叠起来

注意:

1. 需要使用set函数设置y轴刻度标签

2. 需要使用legend函数设置图例

% 复式百分条图
x = [1 2];
y = [0.4 0.7; 0.5 0.1;0.1 0.2];
barh(x,y,'stacked')
x = {'近视眼','肥胖'};
set(gca, 'yticklabel', x);
legend('青少年','中年人','老年人')

代码运行如下  

三、圆图(圆环图)

3.1 圆图(饼图)

直接利用pie函数即可,如需绘制三维图利用pie3函数即可。

% 圆图(饼图)
x = [10,30,20,40];
pie(x)

代码运行如下  

若需额外突出某一块,可以使用explode函数,如下代码,explode = [0,1,0,0];表示突出第二块。

还可以使用labels函数设置每一块的标签。

% 圆图(饼图)
x = [10,30,20,40];
pie(x)
explode = [0,1,0,0];
labels = {'大一','大二','大三','大四'};
pie(x,explode,labels)

代码运行如下  

3.2 复式圆图

需要同时绘制两张图并共用一个图例,可以使用subplot函数绘制子图。subplot(1,2,1)表示绘制一张1*2的子图,最后的1表示第一张图。

% 复式圆图
x1 = [10,30,20,40];
x2 = [20,40,30,10];
subplot(1,2,1);pie(x1);title('男');
subplot(1,2,2);pie(x2);title('女');
legend('大一','大二','大三','大四')

代码运行如下  

3.3 圆环图

利用pie函数和fill函数绘制圆环图

具体思路:

- 先绘制一张圆图

- 再在中间绘制一个白色的圆

% 圆环图
x = [10,30,20,40];
pie(x);
hold on
t=linspace(0,2*pi,200);
fill(cos(t).*.5,sin(t).*.5,'w')

代码运行如下  

3.4 复式圆环图

复式圆环图绘制无法调用函数,需要逐步绘制,具体思路如下:

- 先绘制半径r为1的扇形并填充颜色

- 再绘制半径r为0.77的扇形并填充颜色

- 最后再绘制一个半径为0.5的白色圆形在中间

注意:

1. 需要从12点方向顺时针绘制

2. 绘制一张图后,画下一张图前,需要使用hold on,确保画在同一张图

3. 需要使用axis equal 确保圆形不变形

4. 将横纵坐标周刻度去掉

5. 最后需要使用text函数给各部分命名。

% 复式圆环图
theta = linspace(0*pi/180, 90*pi/180, 100); 
r = 1; 
x = [0, r * cos(theta), 0]; 
y = [0, r * sin(theta), 0]; 
color = [0.8858,0.8500,0.8880];
fill(x, y, color); 

hold on
theta = linspace(210*pi/180, 360*pi/180, 100); 
r = 1; 
x = [0, r * cos(theta), 0]; 
y = [0, r * sin(theta), 0]; 
color = [0.6173,0.7311,0.7864];
fill(x, y, color); 

hold on
theta = linspace(90*pi/180, 210*pi/180, 100); 
r = 1; 
x = [0, r * cos(theta), 0]; 
y = [0, r * sin(theta), 0]; 
color = [0.4041,0.5218,0.7440];
fill(x, y, color); 

theta = linspace(300*pi/180, 450*pi/180, 100); 
r = 0.77; 
x = [0, r * cos(theta), 0]; 
y = [0, r * sin(theta), 0]; 
color = [0.9858,0.8500,0.8880];
fill(x, y, color); 

hold on
theta = linspace(180*pi/180, 300*pi/180, 100); 
r = 0.77; 
x = [0, r * cos(theta), 0]; 
y = [0, r * sin(theta), 0]; 
color = [0.7173,0.7311,0.7864];
fill(x, y, color); 

hold on
theta = linspace(90*pi/180, 180*pi/180, 100); 
r = 0.77; 
x = [0, r * cos(theta), 0]; 
y = [0, r * sin(theta), 0]; 
color = [0.5041,0.5218,0.7440];
fill(x, y, color); 

t=linspace(0,2*pi,200);
fill(cos(t).*.5,sin(t).*.5,'w')

axis([-1.2,1.6,-1.2,1.6])
axis equal;
set(gca,'xticklabel',[])  
set(gca,'yticklabel',[])

text(0.6,0.6,'25%')
text(0.4,-0.75,'42%')
text(-0.82,0.5,'33%')
text(0.55,0.1,'42%')
text(-0.35,-0.53,'33%')
text(-0.55,0.4,'25%')

legend('男性近视眼患病率','男性远视眼患病率','男性肥胖患病率','女性近视眼患病率','女性远视眼患病率','女性肥胖患病率','')

代码运行如下 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值