概述
本次的内容涉及到除了线图以外的绘图,包括离散绘图、极坐标绘图、曲面绘图和统计绘图。
- 离散绘图:茎干图、阶梯图和散点图
- 极坐标绘图:polar前缀
- 曲面绘图:surf 曲面图和 mesh 网格图
- 统计绘图:条形图、统计直方图和饼状图
子窗口
subplot 函数指的是将当前图窗划分为 m
×n
网格,并在编号 p
指定的位置创建坐标区。
编号规则为:从第一行自左向右递增。
% subplot(m,n,p);
% 将绘图窗口分为 m 行 n 列的矩形区域
% 并在编号第 p 的区域中绘图
figure();
% 2*2 分割的第一块区域也就是左上角
subplot(2,2,1);
x = linspace(-3.8,3.8);
y_cos = cos(x);
plot(x,y_cos);
title('Subplot 1: Cosine')
% 2*2 分割的第二块区域也就是右上角
subplot(2,2,2);
y_poly = 1 - x.^2./2 + x.^4./24;
plot(x,y_poly,'g');
title('Subplot 2: Polynomial')
% 2*2 分割的第三、四块区域也就是下方
subplot(2,2,[3,4]);
% 也可以写作 subplot(2,1,2); 指的是同一区域。
plot(x,y_cos,'b',x,y_poly,'g');
title('Subplot 3 and 4: Both')
离散绘图
茎干图(stem)
stem 函数的功能是描述离散数据中的冲激函数,以绘图高度反映一维离散序列中脉冲的强度。
数据值对应每一个脉冲的强度。
figure(1)
X = linspace(0,2*pi,50)';
Y = cos(X);
subplot(2,1,1);
stem(X);
subplot(2,1,2);
stem(X,Y);
阶梯图(stairs)
stairs 函数的功能是描述离散数据中的阶跃函数,以绘图高度反映一维阶跃信号中的实时强度。
数据值为每一个时间周期的高度。
X = linspace(0,4*pi,40);
Y = sin(X);
figure(1);
subplot(2,1,1);
stairs(Y);
subplot(2,1,2);
stairs(X,Y);% 这种调用方式应当保证 X 有序
散点图(scatter)
scatter 函数绘制二维平面上的散点图,也就是不绘制曲线的 plot 函数。
输入参数为散点图的横坐标序列和纵坐标序列。
x = linspace(0,3*pi,200);
y = cos(x) + rand(1,200);
M_size = linspace(1,100,200);
figure(1);
subplot(2,1,1);
scatter(x,y);
subplot(2,1,2);
scatter(x,y,M_size);
极坐标绘图
我们直到直角坐标和极坐标系都是常用的坐标系,并且两种坐标系之间存在一定的转换关系,但是用 plot 函数绘制转换后的极坐标系图形总是不美观。
polar 函数是 MATLAB 中用于绘制极坐标图的函数。
polar 函数已经被 MATLAB 官方更替,更推荐使用的是新的函数方法:polarplot (新方法在旧版本的 MATLAB 如 2015b 版本仍不可用)。因此如果你在使用旧版本软件,使用 polar 方法;如果你在使用的版本支持 polarplot 函数,那就使用 polarplot 函数。
polarplot 函数就是极坐标系下的 plot 函数。以 polarplot(theta,rho) 形式调用。
theta = 0:0.01:2*pi; % 角度
rho = sin(2*theta).*cos(2*theta); % 幅值
figure(1);
polarplot(theta,rho);
% 此处有版本兼容问题,旧版本无法使用该函数
% 旧版本应当使用 polar(theta,rho);
同理,也有 polarscatter 函数。
曲面绘图
曲线上的点是无限的,于是计算机用散点序列代替直线;曲面上由无数曲线构成,自然类比想到使用网格代替平面。
surf 函数
surf 函数将创建一个三维曲面图。该函数将矩阵 Z 中的值绘制为由 X 和 Y 定义的 x-y 平面中的网格上方的高度;此外,函数将对三维曲面进行渲染,每个区域的颜色与高度成比例。
x0 = 1:0.5:10;
y0 = 1:20;
[X,Y] = meshgrid(x0,y0);
% meshgrid 函数将创建两个由 x0*y0 构成的二维网格矩阵。
% X 表示网格中对应位置的 x0 值
% Y 表示网格中对应位置的 y0 值
% - 可以预见到对于同一个 y0 ,x0 值相同。
Z = sin(X) + cos(Y);
surf(X,Y,Z);
其他 surf 类型曲面图函数
- surfc 函数:在 surf 函数的基础上,在底部绘制等高线图。
- surfl 函数:在 surf 函数的基础上,用光线为三维图渲染。
mesh 函数
surf 函数将创建一个三维曲面图。该函数将矩阵 Z 中的值绘制为由 X 和 Y 定义的 x-y 平面中的网格上方的高度;函数仅对于三维网格进行渲染,每个区域的颜色与高度成比例。
[X,Y] = meshgrid(-8:.5:8);
R = sqrt(X.^2 + Y.^2) + eps;
Z = sin(R)./R;
figure(1);
mesh(Z);
其他 mesh 类型曲面图函数
- meshc函数:在 mesh 函数的基础上,在底部绘制等高线图。
- meshz 函数:在 mesh 函数的基础上,每个网格高度以柱状反映。
统计绘图
bar 函数
bar 函数顾名思义是绘制条形图的函数。
由于统计图表有着多种形式的表现需求,这里使用子窗口绘图来实现。
x = 190:1:200;
y = [75 91 105 123.5 131 150 179 203 226 249 281.5];
z = [2 2 3; 2 5 6; 2 8 9; 2 11 12];
figure(1);
subplot(2,3,1);
bar(y);
subplot(2,3,2);
bar(y,'r')
subplot(2,3,3);
bar(x,y);
subplot(2,3,4);
bar(y,0.4);
subplot(2,3,5);
bar(z);
subplot(2,3,6);
bar(z,'stacked')
其他 bar 类型函数:
- bar3 函数:绘制三维条形图
- barh 函数:绘制水平条形图
- bar3h 函数:绘制三维水平条形图
histogram 函数
histogram 函数的功能是根据传入的数据绘制统计直方图。
x = randn(10000,1);
% 10000 个高斯分布随机数
nbins = 25;
% 直方图分布区间数量
figure(1);
subplot(2,1,1);
h = histogram(x);
subplot(2,1,2);
h = histogram(x,nbins);
其他 histogram 函数:
- histogram2 函数:绘制二元统计直方图;
- pareto 函数:绘制帕累托图
- polarhistogram 函数:在极坐标系上绘制根据角度绘制分布图
pie 函数
pie 函数的功能是根据传入的比例序列绘制饼状图。
特别地:如果 pie(x) 中,
- sum(x) < 1,仅绘制部分饼状图。
- sum(x) > 1,先做归一化后绘制饼状图。
figure(1);
X = [1 3 0.5 2.5 2];
explode = [0 1 0 1 0];
labels = {'A','B','C','D','E'};
subplot(2,2,1);
pie(X);
% 归一化计算比例
subplot(2,2,2);
pie(X,explode);
% explode 选中的块会突出显示
subplot(2,2,3);
pie(X,labels);
% 以标签代替百分数
subplot(2,2,4);
x1 = [0.19 0.22 0.41];
pie(x1);
% 不足 100% 则绘制部分饼状图
其他 pie 类型函数:
- pie3 函数:绘制三维饼状图;
其他可视化绘图
这部分内容极少使用,不需要在意。
heatmap 函数:根据数据集绘制热图;
wordcloud 函数:使用文本数据创建词云图;
geobubble 函数:以可视方式呈现特定地理位置的数据值
小结
本节中提到除了线图以外的另外四种常见绘图:离散绘图、极坐标绘图、曲面绘图和统计绘图。
值得一提的是,对于极坐标绘图的函数方法,官方已经给出更佳的更新,但旧版本中无法应用,这里给出的为新版本的方案。