五、MATLAB数据可视化
声明:
笔记是学习慕课网《科学计算与MATLAB语言》课程和刘卫国主编的《MATLAB程序设计与应用(第3版)》后的个人总结,方便自己以后巩固和复习!
5.1 二维图形
5.1.1、绘制二维曲线的基本函数
1.plot函数的基本用法
plot函数的基本调用格式为:
plot(x,y)
其中x和y为长度相同的向量,分别用于存储x坐标和y坐标数据。
例1:在0≤X≤2区间内,绘制曲线y=2e-0.5xsin(2πx)。
程序如下:
x=0:pi/100:2*pi;
y=2*exp(-0.5*x).*sin(2*pi*x);
plot(x,y)
例2: 绘制曲线。
程序如下:
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函数调用格式为:
plot(x1,y1,x2,y2,…,xn,yn)
3.含选项的plot函数
含选项的plot函数调用格式为:
plot(x1,y1,选项1,x2,y2, 选项2,…,xn,yn,选项n)
例3 用不同线型和颜色在同一坐标内绘制曲线
及其包络线。
程序如下:
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数据对。
例4 用不同标度在同一坐标内绘制曲线
y1=e-0.5xsin(2πx)及曲线y2=sin(x)。
程序如下:
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.图形标注
有关图形标注函数的调用格式为:
title(图形名称)
xlabel(x轴说明)
ylabel(y轴说明)
text(x,y,图形说明)
legend(图例1,图例2,…)
2.坐标控制
函数的调用格式为:
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 绘制分段函数曲线并添加图形标注
>> 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命令在两种状态之间进行切换。
例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);
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)
例7 在一个图形窗口中以子图形式同时绘制正弦、余弦、正切、余切曲线。
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函数的调用格式为:
fplot(fname,lims,tol,选项)
例8 用fplot函数绘制f(x)=cos(tan(πx))的曲线。
fplot(@(x)cos(tan(pi*x)),[0,1])
5.2.2 其他坐标系下的二维曲线图
1.对数坐标图形
MATLAB提供了绘制对数和半对数坐标曲线的函数,调用格式为:
semilogx(x1,y1,选项1,x2,y2,选项2,…)
semilogy(x1,y1,选项1,x2,y2,选项2,…)
loglog(x1,y1,选项1,x2,y2,选项2,…)
例9 绘制
的对数坐标图并与直角线性坐标图进行比较。
程序如下:
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函数用来绘制极坐标图,其调用格式为:
polar(theta,rho,LineSpec)
其中theta为极坐标极角,rho为极坐标矢径,选项的内容与plot函数相似。
例10 绘制极坐标图。
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) 条形类图形
bar(y)
bar(x,y,选项)
例11 条形图应用示例。
程序如下:
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函数的应用更为广泛一些,其调用格式为:
hist(y[,x])
例12 绘制服从高斯分布的直方图,再将这些数据分到指定范围的区间中,并绘制直方图中。
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函数非常相似,调用方法如下:
rose(theta[,x])
例13 绘制例5-12中高斯分布数据在极坐标下的直方图。
y=randn(500,1);
theta=y*pi;
rose(theta)
title('在极坐标下的直方图')
2.面积类图形
(1)扇形统计图
扇形统计图又称为饼图,反映一个数据系列中各个分量在总数量中所占的比重。MATLAB提供了pie函数来绘制扇形统计图,其调用格式为:
pie(x,explode)
例14 某次考试优秀、良好、中等、及格、不及格的人数分别为:7、17、23、19、5,试用扇形统计图作成绩统计分析。
程序如下:
pie([7,17,23,19,5],[0,0,0,1,1]) %对应第5分量部分从饼图中心分离
title('饼图')
legend('优秀','良好','中等','及格','不及格')
注意:
pie([7,17,23,19,5],[0,0,0,0,1]) %中1对应的是将5%突出、分开
pie([7,17,23,19,5],[0,0,0,1,1]) %对应第5分量部分从饼图中心分离
title('饼图')
legend('优秀','良好','中等','及格','不及格')
(2)面积统计图
面积统计图反映数量变化的趋势,在实际中可以表现不同部分对整体的影响。在MATLAB中,绘制面积统计图的函数是area,其调用格式为:
① area(x)。
② area(x,y)
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,其调用格式为:
fill(x,y,颜色)
例15 绘制一个红色的正八边形。
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个函数的调用格式为:
scatter(x,y[,'filled'][,颜色])
stairs(x,y,选项)
stem(x,y,选项)
例16 分别以散点图、阶梯图和杆图形式绘制曲线
程序如下:
>> 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
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)罗盘图
罗盘图表示起点为坐标原点的向量,同时还在坐标系中显示圆形的分隔线。
① compass(x,y) 。
② compass(z)
(2)羽毛图
① feather(x,y) 。
② feather(z) 。
(3)箭头图
quiver([x,y,]u,v)
例18 分别以罗盘图、羽毛图和箭头图形式绘制绘制正弦曲线。
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的有关功能扩展到三维空间。
plot3(x1,y1,z1,选项1,x2,y2,z2,选项2,…,xn,yn,zn,选项n)
例19 绘制空间曲线。
先求出曲线所对应的参数方程:
程序如下:
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)利用矩阵运算生成。
x=a:dx:b; y=(c:dy:d)';
X=ones(size(y))*x;
Y=y*ones(size(x));
(2)利用meshgrid函数生成。
x=a:dx:b; y=c:dy:d;
[X,Y]=meshgrid(x,y);
例20 已知6<x<30,15<y<36,求不定方程2x+5y=126的整数解。
程序如下:
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.绘制三维曲面的函数
mesh(x,y,z,c)
surf(x,y,z,c)
例21 用三维曲面图z=sin(y)cos(x)。
%程序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;
例22 绘制两个直径相等的圆管的相交图形。
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函数的调用格式为:
[x,y,z]=sphere(n)
cylinder函数的调用格式为:
[x,y,z]=sphere(R,n)
MATLAB还有一个peaks 函数,称为多峰函数,常用于三维曲面的演示。
5.2.3 其他三维图形
1.三维条形图
bar3(y)
bar3(x,y)
2.三维饼图
pie3(x,explode)
3.三维实心图
fill3(x,y,z,c)
4.三维散点图
scatter3(x,y,z,c)
5.三维杆图
stem3(z)
stem3(x,y,z)
6.三维箭头图
quiver3(x,y,z,u,v,w)
例23 绘制三维图形:
(1)绘制魔方阵的三维条形图。
(2)以三维杆图形式绘制曲线y=2sin(x)。
(3)已知x=[2347,1827,2043,3025],绘制三维饼图。
(4)用随机的顶点坐标值画出五个黄色三角形。
程序如下:
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' )