一、绘制直条图
直条图分为单式和复式两种。单式适用于只有一组变量,复式适用于有若干组变量。
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('男性近视眼患病率','男性远视眼患病率','男性肥胖患病率','女性近视眼患病率','女性远视眼患病率','女性肥胖患病率','')
代码运行如下