五、MATLAB数据可视化

5.1 二维图形

5.1.1、绘制二维曲线的基本函数

1.plot函数的基本用法
plot函数的基本调用格式为:

1
plot(x,y) 

其中x和y为长度相同的向量,分别用于存储x坐标和y坐标数据。

例1:在0≤X≤2区间内,绘制曲线y=2e-0.5xsin(2πx)。
程序如下:

1
2
3
x=0:pi/100:2*pi;
y=2*exp(-0.5*x).*sin(2*pi*x);
plot(x,y)

例2: 绘制曲线。

程序如下:

1
2
3
4
t=-pi:pi/100:pi;
x=t.*cos(3*t);
y=t.*sin(t).*sin(t);
plot(x,y);

说明:
(1)当x是向量,y是矩阵时,x的长度与矩阵y的行数或列数必须相等。如果x的长度等于y的行数,则以x和y的每列为横、纵坐标绘制曲线,曲线的条数等y的列数。如果x的长度等于y的列数,则以x和y的每行为横、纵坐标绘制曲线,曲线的条数等y的行数。
(2)当x、y是同维矩阵时,则以x、y对应列元素为横、纵坐标分别绘制曲线,曲线条数等于矩阵的列数。
(3)plot函数最简单的调用格式是只包含一个输入参数:plot(x)。

2.含多个输入参数的plot函数
含多个输入参数的plot函数调用格式为:

1
plot(x1,y1,x2,y2,…,xn,yn)

3.含选项的plot函数
含选项的plot函数调用格式为:

1
plot(x1,y1,选项1,x2,y2, 选项2,…,xn,yn,选项n)

例3 用不同线型和颜色在同一坐标内绘制曲线

及其包络线。
程序如下:

1
2
3
4
5
6
x=(0:pi/100:2*pi)';
y1=2*exp(-0.5*x)*[1,-1];
y2=2*exp(-0.5*x).*sin(2*pi*x);
x1=(0:12)/2;
y3=2*exp(-0.5*x1).*sin(2*pi*x1);
plot(x,y1,'g:',x,y2,'b--',x1,y3,'rp');

4.双纵坐标函数plotyy
plotyy函数是MATLAB 5.X新增的函数。它能把函数值具有不同量纲、不同数量级的两个函数绘制在同一坐标中。调用格式为:
plotyy(x1,y1,x2,y2)
其中x1-y1对应一条曲线,x2-y2对应另一条曲线。横坐标的标度相同,纵坐标有两个,左纵坐标用于x1-y1数据对,右纵坐标用于x2-y2数据对。

例5-4 用不同标度在同一坐标内绘制曲线
y1=e-0.5xsin(2πx)及曲线y2=sin(x)。
程序如下:

1
2
3
4
5
   x1=0:pi/100:2*pi;
x2=0:pi/100:3*pi;
y1=exp(-0.5*x1).*sin(2*pi*x1);
y2= sin(x2);
plotyy(x1,y1,x2,y2);

5.1.2 绘制图形的辅助操作

1.图形标注
有关图形标注函数的调用格式为:

1
2
3
4
5
title(图形名称)
xlabel(x轴说明)
ylabel(y轴说明)
text(x,y,图形说明)
legend(图例1,图例2,…)

2.坐标控制
函数的调用格式为:

1
2
3
4
5
6
7
8
9
axis([xmin xmax ymin ymax zmin zmax])
axis函数功能丰富,常用的用法还有:
axis equal 纵、横坐标轴采用等长刻度
axis square 产生正方形坐标系(缺省为矩形)
axis auto 使用缺省设置
axis off 取消坐标轴
axis on 显示坐标轴
grid on/off命令控制是画还是不画网格线,不带参数的grid命令在两种状态之间进行切换。
box on/off命令控制是加还是不加边框线,不带参数的box命令在两种状态之间进行切换。

例5 绘制分段函数曲线并添加图形标注

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
>> x=linspace(0,10,100);
y=[];
for x0=x
if x0>=8
y=[y,1];
elseif x0>=6
y=[y,5-x0/2];
elseif x0>=4
y=[y,2];
elseif x0>=0
y=[y,sqrt(x0)];
end
end
plot(x,y)
axis([0 10 0 2.5]) %设置坐标轴
title('分段函数曲线'); %加图形标题
xlabel('Variable X'); %加X轴说明
ylabel('Variable Y'); %加Y轴说明
text(2,1.3,'y=x^{1/2}'); %在指定位置添加图形说明
text(4.5,1.9,'y=2');
text(7.3,1.5,'y=5-x/2');
text(8.5,0.9,'y=1');

3.图形保持
一般情况下,绘图命令每执行一次就刷新当前图形窗口,图形窗口原有图形将不复存在。若希望在已存在的图形上再继续添加新的图形,可使用图形保持命令hold。hold on/off命令控制是保持原有图形还是刷新原有图形,不带参数的hold命令在两种状态之间进行切换。

例5-6 用图形保持功能在同一坐标内绘制曲线)及其包络线。

1
2
3
4
5
6
7
8
9
10
x=(0:pi/100:2*pi)';
y1=2*exp(-0.5*x)*[1,-1];
y2=2*exp(-0.5*x).*sin(2*pi*x);
plot(x,y1,'b:');
axis([0,2*pi,-2,2]); %设置坐标
hold on; %设置图形保持状态
plot(x,y2,'k');
legend('包络线','包络线','曲线y'); %加图例
hold off; %关闭图形保持
grid %网格线控制

4.图形窗口的分割
subplot函数的调用格式为:
subplot(m,n,p)

例5-7 在一个图形窗口中以子图形式同时绘制正弦、余弦、正切、余切曲线。

1
2
3
4
5
6
7
8
9
10
11
x=linspace(0,2*pi,60);
y=sin(x);z=cos(x);
t=sin(x)./(cos(x)+eps); ct=cos(x)./(sin(x)+eps);
subplot(2,2,1);
plot(x,y);title('sin(x)');axis ([0,2*pi,-1,1]);
subplot(2,2,2);
plot(x,z);title('cos(x)');axis ([0,2*pi,-1,1]);
subplot(2,2,3);
plot(x,t);title('tangent(x)');axis ([0,2*pi,-40,40]);
subplot(2,2,4);
plot(x,ct);title('cotangent(x)');axis ([0,2*pi,-40,40]);

5.2 其他形式的二维图形

5.2.1 对函数自适应采样的绘图函数

fplot函数的调用格式为:

1
fplot(fname,lims,tol,选项)

例8 用fplot函数绘制f(x)=cos(tan(πx))的曲线。

1
fplot(@(x)cos(tan(pi*x)),[0,1])

5.2.2 其他坐标系下的二维曲线图

1.对数坐标图形
MATLAB提供了绘制对数和半对数坐标曲线的函数,调用格式为:

1
2
3
semilogx(x1,y1,选项1,x2,y2,选项2,…)
semilogy(x1,y1,选项1,x2,y2,选项2,…)
loglog(x1,y1,选项1,x2,y2,选项2,…)

​ 例9 绘制的对数坐标图并与直角线性坐标图进行比较。
​ 程序如下:

1
2
3
4
5
6
7
8
9
10
x=0:0.1:10;
y=10*x.*x;
subplot(2,2,1);
plot(x,y);title('plot(x,y)');grid on;
subplot(2,2,2);
semilogx(x,y);title('semilogx(x,y)');grid on;
subplot(2,2,3);
semilogy(x,y);title('semilogy(x,y)');grid on;
subplot(2,2,4);
loglog(x,y);title('loglog(x,y)');grid on;

2.极坐标图
polar函数用来绘制极坐标图,其调用格式为:

1
polar(theta,rho,LineSpec)

其中theta为极坐标极角,rho为极坐标矢径,选项的内容与plot函数相似。

例5-10 绘制极坐标图。

1
2
3
4
5
6
7
t=0:pi/50:20*pi;
r1=exp(cos(t))-2*cos(4*t)+sin(t/12).^5;
r2=exp(cos(t-pi/2))-2*cos(4*(t-pi/2))+sin((t-pi/2)/12).^5;
subplot(1,2,1)
polar(t,r1);title('蝴蝶曲线'); %绘制蝴蝶曲线
subplot(1,2,2)
polar(t,r2);title('旋转90度的蝴蝶曲线'); %旋转90度的蝴蝶曲线

5.2.3 其他特殊二维图形

1.其他形式的线性直角坐标图

在线性直角坐标系中,其他形式的图形有条形图、阶梯图、杆图和填充图等
(1) 条形类图形

1
2
bar(y)
bar(x,y,选项)

例11 条形图应用示例。
程序如下:

1
2
3
4
5
x=-1:1;  y=[1,2,3,4,5;1,2,1,2,1;5,4,3,2,1];
subplot(2,2,1);bar(x,y,'grouped')
title('Group');axis([-3,3,0,6])
subplot(2,2,2);barh(x,y,'stacked')
title('Stack')

(2)直方图
在MATLAB中,绘制直方图的函数有两个:hist函数和rose函数,分别用于绘制直角坐标系下的直方图和极坐标系下的直方图,后者也称为玫瑰花图。
hist函数的应用更为广泛一些,其调用格式为:

1
hist(y[,x])

例12 绘制服从高斯分布的直方图,再将这些数据分到指定范围的区间中,并绘制直方图中。

1
2
3
4
5
6
y=randn(500,1);
subplot(2,2,1)
hist(y);title('高斯分布直方图')
x=-4:0.1:4;
subplot(2,2,2)
hist(y,x);title('指定范围的高斯分布直方图')

rose函数的调用格式与hist函数非常相似,调用方法如下:

1
rose(theta[,x])

例13 绘制例5-12中高斯分布数据在极坐标下的直方图。

1
2
3
4
y=randn(500,1);
theta=y*pi;
rose(theta)
title('在极坐标下的直方图')

2.面积类图形

(1)扇形统计图
扇形统计图又称为饼图,反映一个数据系列中各个分量在总数量中所占的比重。MATLAB提供了pie函数来绘制扇形统计图,其调用格式为:

1
pie(x,explode)

例14 某次考试优秀、良好、中等、及格、不及格的人数分别为:7、17、23、19、5,试用扇形统计图作成绩统计分析。
程序如下:

1
2
3
pie([7,17,23,19,5],[0,0,0,1,1])   %对应第5分量部分从饼图中心分离
title('饼图')
legend('优秀','良好','中等','及格','不及格')

注意:

1
pie([7,17,23,19,5],[0,0,0,0,1])  %中1对应的是将5%突出、分开
1
2
3
pie([7,17,23,19,5],[0,0,0,1,1])   %对应第5分量部分从饼图中心分离
title('饼图')
legend('优秀','良好','中等','及格','不及格')

(2)面积统计图
面积统计图反映数量变化的趋势,在实际中可以表现不同部分对整体的影响。在MATLAB中,绘制面积统计图的函数是area,其调用格式为:

1
2
① area(x)。
② area(x,y)
1
2
3
4
x=1:2:9;
y=[1,3,5,2,6;2,4,5,6,2;5,4,7,2,2]';
area(x,y);
grid on;title('面积统计图')

(3)实心图
实心图是将数据的起点和终点连成多边形,并填充颜色。绘制实心图的函数是fill,其调用格式为:

1
fill(x,y,颜色)

例15 绘制一个红色的正八边形。

1
2
3
4
5
6
t=0:2*pi/8:2*pi; %取正八边形坐标点
t=[t,t(1)]; %数据向量的首尾重合,使图形封闭。
x=sin(t);
y=cos(t);
fill(x,y,'r') %x、y是圆周坐标,数据间隔足够小时可以画圆
axis equal;axis([-1.5,1.5,-1.5,1.5])

3.散点类图形

MATLAB提供了绘制散点类图形的函数scatter、stairs和stem,分别用于绘制散点图、阶梯图和杆图。3个函数的调用格式为:

1
2
3
scatter(x,y[,'filled'][,颜色])
stairs(x,y,选项)
stem(x,y,选项)

例16 分别以散点图、阶梯图和杆图形式绘制曲线
程序如下:

1
2
3
4
>> x=0:0.35:7;y=2*exp(-0.5*x);
subplot(2,3,1);scatter(x,y,'g');title('scatter(x,y,''g'')');axis([0,7,0,2])
subplot(2,3,2);stairs(x,y,'b');title('stairs(x,y,''b'')');axis([0,7,0,2])
subplot(2,3,3);stem(x,y,'k');title('stem(x,y,''k'')');axis([0,7,0,2])

例17

1
2
3
4
t = 0:pi/50:2*pi;
x = 16*sin(t).^3;
y = 13*cos(t) - 5*cos(2*t) - 2*cos(3*t) - cos(4*t);
scatter(x,y,'rd','filled')

4.矢量类图形

(1)罗盘图
罗盘图表示起点为坐标原点的向量,同时还在坐标系中显示圆形的分隔线。

1
2
① compass(x,y) 。
② compass(z)

(2)羽毛图

1
2
① feather(x,y) 。
② feather(z) 。

(3)箭头图

1
quiver([x,y,]u,v)

例18 分别以罗盘图、羽毛图和箭头图形式绘制绘制正弦曲线。

1
2
3
4
5
6
7
8
x=-pi:pi/8:pi;
y=sin(x);
subplot(2,2,1);compass(x,y)
title('罗盘图')
subplot(2,2,2);feather(x,y)
title('羽毛图')
subplot(2,1,2);quiver(x,y)
title('箭头图')

5.3 三维图形

5.3.1 绘制三维曲线的基本函数

​ plot3将二维绘图函数plot的有关功能扩展到三维空间。

1
plot3(x1,y1,z1,选项1,x2,y2,z2,选项2,…,xn,yn,zn,选项n)

例5-18 绘制空间曲线。

先求出曲线所对应的参数方程:

程序如下:

1
2
3
4
5
6
7
t=0:pi/50:2*pi;
x=8*cos(t);
y=4*sqrt(2)*sin(t);
z=-4*sqrt(2)*sin(t);
plot3(x,y,z,'p');
title('Line in 3-D Space');text(0,0,0,'origin');
xlabel('X'),ylabel('Y'),zlabel('Z');grid;

5.3.2 三维曲面

1.平面网格坐标矩阵的生成

(1)利用矩阵运算生成。

1
2
3
x=a:dx:b; y=(c:dy:d)';
X=ones(size(y))*x;
Y=y*ones(size(x));

(2)利用meshgrid函数生成。

1
2
x=a:dx:b; y=c:dy:d;
[X,Y]=meshgrid(x,y);

例19 已知6<x<30,15<y<36,求不定方程2x+5y=126的整数解。
程序如下:

1
2
3
4
5
6
x=7:29;
y=16:35;
[x,y]=meshgrid(x,y); %在[7,29]×[16,35]区域生成网格坐标
z=2*x+5*y;
k=find(z==126); %找出解的位置
x(k)',y(k)' %输出对应位置的x,y即方程的解
2.绘制三维曲面的函数
1
2
mesh(x,y,z,c)
surf(x,y,z,c)

例20 用三维曲面图z=sin(y)cos(x)。

1
2
3
4
5
6
7
8
9
%程序1:
x=0:0.1:2*pi;[x,y]=meshgrid(x);z=sin(y).*cos(x);
mesh(x,y,z);xlabel('x-axis'),ylabel('y-axis'),zlabel('z-axis');title('mesh');
%程序2:
x=0:0.1:2*pi;[x,y]=meshgrid(x);z=sin(y).*cos(x);
surf(x,y,z);xlabel('x-axis'),ylabel('y-axis'),zlabel('z-axis');title('surf');
%程序3:
x=0:0.1:2*pi;[x,y]=meshgrid(x);z=sin(y).*cos(x);
plot3(x,y,z);xlabel('x-axis'),ylabel('y-axis'),zlabel('z-axis');title('plot3-1');grid;

例21 绘制两个直径相等的圆管的相交图形。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
m=30;z=1.2*(0:m)/m;r=ones(size(z));theta=(0:m)/m*2*pi;
x1=r'*cos(theta); %生成第一个圆柱体的坐标矩阵
y1=r'*sin(theta);
z1=z'*ones(1,m+1);
x=(-m:2:m)/m;
x2=x'*ones(1,m+1); %生成第二个圆柱体的坐标矩阵
y2=r'*cos(theta);
z2=r'*sin(theta);
surf(x1,y1,z1) %绘制垂直的圆柱体
axis equal,axis off
hold on
surf(x2,y2,z2) %绘制水平的圆柱体
axis equal,axis off
title('两个圆柱体的相交图形')
hold off

3.标准三维曲面

sphere函数的调用格式为:

1
[x,y,z]=sphere(n)

cylinder函数的调用格式为:

1
[x,y,z]=sphere(R,n)

MATLAB还有一个peaks 函数,称为多峰函数,常用于三维曲面的演示。

5.2.3 其他三维图形

1.三维条形图

1
2
bar3(y)
bar3(x,y)

2.三维饼图

1
pie3(x,explode)

3.三维实心图

1
fill3(x,y,z,c)

4.三维散点图

1
scatter3(x,y,z,c)

5.三维杆图

1
2
stem3(z)
stem3(x,y,z)

6.三维箭头图

1
quiver3(x,y,z,u,v,w)

例22 绘制三维图形:
(1)绘制魔方阵的三维条形图。
(2)以三维杆图形式绘制曲线y=2sin(x)。
(3)已知x=[2347,1827,2043,3025],绘制三维饼图。
(4)用随机的顶点坐标值画出五个黄色三角形。
程序如下:

1
2
3
4
5
6
7
8
9
subplot(2,2,1);
bar3(magic(4))
subplot(2,2,2);
y=2*sin(0:pi/10:2*pi);
stem3(y);
subplot(2,2,3);
pie3([2347,1827,2043,3025]);
subplot(2,2,4);
fill3(rand(3,5),rand(3,5),rand(3,5), 'y' )