MatLab讲义 2002年9月版 plotmatrix 矩阵折(曲)线图 ribbon 带状图 scatter 点图(与plot的绘制结果相似,但是只有数据点) stem 火柴杆图 stairs 阶梯图 例1:用area函数绘制面积图。area函数将矢量数据或矩阵列矢量数据显示为曲线,并且将曲线与x轴之间的区间填充指定颜色。
用面积图描述某公司1990-1994年销售与利润情况。 sales=[51.6 82.4 90.8 59.1 47.0]; x=90:94;
profits=[19.3 34. 61.4 50.5 29.40];
area(x,sales,'FaceColor',[.5 .9 .6],'EdgeColor','b','Linewidth',2) hold on
area(x,profits,'facecolor',[.9 .85 .7],'edgecolor','y','linewidth',2) hold off
set(gca,'Xtick',[90:94]);set(gca,'Layer','top');
gtext('\\leftarrow sales');gtext('profits'),gtext('expenses')
xlabel('years','fontsize',10), ylabel('Sales in 1,000''s','fontsize',10) 面积图例: Y = [ 1, 5, 3; 3, 2, 7; 1, 5, 3; 2, 6, 1]; area(Y):grid on colormap summer
set(gca,'Layer','top') title 'Stacked Area Plot'
例2:用bar函数绘制向量y的直方图 x=0:pi/10:2*pi; y=cos(x);
bar(y); %%取Y元素的下标作为X坐标值 hold on
bar(x,y,?r?);
将bar换成barh成垂直的直方图、bar3成三维直方图、bar3h成垂直的三维直方图。 例3:用随机函数rand产生一个矩阵,从而得到复杂的条形图。 y=round(rand(5,3)*10); figure(1)
subplot(2,2,1),bar(y,?group?),title(?Group?) subplot(2,2,2),bar(y,?stack?),title(?Stack?) subplot(2,2,3),barh(y,?stask?),title(?Stack?) subplot(2,2,4),bar(y,1.5),title(?width=1.5?) 例4:用errorbar(x,y,e)绘制误差棒图 x=1:10; y=sin(x);
e=std(y)*ones(size(x)); errorbar(x,y,e)
注:x,y,e必须是同维;
该指令常用于数理统计离散数据有理化。 例5:hist函数可在二维平面上绘制出柱状图,用来表示数据值的分布情况。其常用格式hist(y,x)。并且可以绘制笛卡尔坐标系和极坐标系两种方式。
分布统计直方图
x=-2.9:0.1:2.9;
16
MatLab讲义 2002年9月版
y=randn(20000,1); figure(1),hist(y,x)
title(?柱状图表示数据分布?) 用rose绘制12小时的风向图
wdir=[45 90 90 45 380 335 360 270 335 270 335 335]; wdir=wdir*pi/180; rose(wdir)
例6:pie函数可绘制出饼图,其常用格式为pie(x),可按向量x中的值的大小绘制出饼图。pie(x,explode)可利用explode指定分离出的切片。
x=[1.1 2.8 0.5 2.5 2]; explode=[0 1 0 0 0]; figure(1) colormap hsv pie(x,explode) title(?饼图?)
注:当x各元素和大于1时,函数对数据进行归一化处理;当各元素和小于1时,函数不对矢量进行归一处理,而只是绘制部分饼图。如:pie([0.1,0.2,0.6])
例7:对于离散数据,采用stem函数。 alpha=0.02;beta=0.5;t=0:4:200; y=exp(-alpha*t).*sin(beta*t); stem(t,y)
xlabel('Time in \\musecs');ylabel('Magnitude') stem3函数在三维空间描述离散序列。
th=(0:127)/128*2*pi;x=cos(th);y=sin(th); f=abs(fft(ones(10,1),128)); stem3(x,y,f','d','fill') view([-65 30]);
stairs函数描述离散序列。
alpha=0.01; beta=0.5; t=0:10; f=exp(-alpha*t).*sin(beta*t); stairs(t,f);hold on
plot(t,f,'--*');hold off
3.9 网格和曲面
MATLAB具有强大的三维图形处理功能,包括三维数据显示、空间、曲面、分块、填充以及曲面光顺着色、视点变换、旋转、隐藏等功能和操作。
(1)plot3(x,y,z,Linespec)
plot3是一个可用来画单变量的三维函数,函数格式除了包括第三维的信息之外,其它与二维函数plot相同。
例:绘制一个三维螺旋线。 t=0:pi/50:8*pi; figure(1)
plot3(sin(t),cos(t),t) grid off,axis square title('三维螺旋线')
例:增加维数的plot3命令可以使多个二维图形沿一个轴排列起来,而不是直接将二维图形叠加到另一个的上面。下例就是二维图形在三维空间的排列。 x=linspace(0,3*pi);
z1=sin(x); z2=sin(2*x);
17
MatLab讲义 2002年9月版
z3=sin(3*x);
y1=zeros(size(x)); y3=zeros(size(x)); y2=y3/2;
plot3(x,y1,z1,x,y2,z2,x,y3,z3);
grid,xlabel(?x-axis‘),ylabel(?y-axis‘),zlabel(?z-axis‘) title(?sin(x),sin(2x),sin(3x)‘) (2)平面网格点的生成
在数学上,函数z=f(x,y)的图形是三维空间的曲面,在MATLAB中,总是假设函数z=f(x,y)是定义在一个矩形的区域D=[x0,xm]*[y0,yn]上的。为了绘制在区域D上的三维曲面,MATLAB的方法是首先将[x0,xm]在x方向上分成m份,将[y0,yn]在y方向分成n份,由各分划点分别作平行于坐标轴的直线,将区域D分成m*n个小矩阵块,计算出在网格点的函数值。对于每个小矩形,在空间中决定出4个顶点(xi,yi,f(xi,yi)),连接4个顶点得到一个空间中的四边形片。所有这些四边形片一起构成函数z=f(x,y)定义在区域D上的空间网格曲面。
为方便起见,MATLAB中用meshgrid函数产生x,y轴向的网格数据,meshgrid函数的一般格式为: [X,Y]=meshgrid(x,y)
其中,x,y分别指向x轴向和y轴向的数据点,当x为n维向量,y为m维向量时,X,Y均为m*n矩阵,X(i,j)和Y(i,j)共同指向平面上的一点,当x,y轴取同一向量时,可简写成 [X,Y]=meshgrid(x) 例:数学函数,定义在区域[-8,8]*[-8,8]上。在生成网格点后,计算网格点上的函数值。
x=-8:0.5:8; y=x;
[X,Y]=meshgrid(x,y); R=sqrt(X.^2+Y.^2)+eps; Z=sin(R)./R
(3)网格曲面(mesh函数)
mesh函数绘制三维空间上的网格曲面,如上例最后加上mesh(Z),生成一曲面。 mesh函数的其它格式为:
mesh(X,Y,Z): X,Y,Z为同维数的矩阵。 mesh(X,Y,Z,C): C称为颜色矩阵。网格曲面的顶点对应于空间的顶点(X(i,j),Y(i,j),Z(i,j)),而网格曲面的网格线的颜色由C值根据当前的色谱来着色。这种调用形式还可以用来生成参数曲面片。
mesh(x,y,Z,C):其中,x和y是向量,Z和C是同维数的矩阵,且向量x的长度等于矩阵Z的列数,而向量y的长度等于矩阵Z的行数。在这种情况下,网格曲面的曲格顶点是(x(j),y(i),Z(i,j)),网格线的长度由矩阵C决定。
mesh(Z,C):Z和C都是m*n矩阵,该形式与mesh(x,y,Z,C)等价。
与mesh相关的另外两个函数是meshc和meshz,它们的调用形式与mesh相同。meshc函数可同时绘制出轮廓图(即等高线图)。meshz的作用除了生成与mesh相同的网和曲面之外,还在曲面下面加上一个长方体的台柱,使图形更加美观。
例:曲面图
[x,y]=meshgrid(-3:.125:3); z=peaks(x,y);c=ones(size(z)); figure(1)
mesh(x,y,z,c),grid on title('多峰函数的网格曲线')
例: [x,y]=meshgrid(-8:0.5:8);
r=sqrt(x.^2 + y.^2) + eps; /*加eps是为了防止出现0/0的情形*/ z=sin(r)./r; mesh(x,y,z);
例:曲面与等高线
18
MatLab讲义 2002年9月版
x=-8:0.5:8; y=x;
[X,Y]=meshgrid(x,y); R=sqrt(X.^2+Y.^2)+eps; Z=sin(R)./R
subplot(2,2,1);meshc(Z) subplot(2,2,2);meshz(Z)
3.10 实曲面的绘制
实曲面就是对网格曲面的网格块(四边形片)区域进行着色的结果。MATLAB的函数surf函数可提供这种功能。它的调用方式与mesh相同,但mesh仅对网格线着色,网格线用黑色标出(可以修改)。而surf是对网格片着色,绘制的是二维曲面。
例:用surf函数表现三维数据。 k=4; n=2^k-1;
theta=pi*(-n:2:n)/n; phi=(pi/2)*(-n:2:n)'/n; X=cos(phi)*cos(theta); Y=cos(phi)*sin(theta); Z=sin(phi)*ones(size(theta));
colormap([0 0 0;1 1 1]);C=hadamard(2^k); surf(X,Y,Z,C); axis square
可以用shading函数来改变着色方式。
如:shading faceted (默认的着色方式,网格线为黑色); shading flat (网格线分块着色); shading interp (光顺性着色)。
网格块的内部像素的颜色由该片的四个顶点的颜色做双线性插值得出。 例:[x,y]=meshgrid(-3:.125:3); z=peaks(x,y);c=ones(size(z)); figure(1)
shading faceted %% shading flat / interp surf(x,y,z,c),grid on
title('多峰函数的网格曲面')
surfc函数绘制二维曲面同时还绘制出轮廓图(即等高线图)。surfl函数能生成具有光照效应的表面,使图形更加美观。同时还可以指定三维坐标系的光源点坐标[x1,y1,z1],或光源方向的球面坐标值,即经度和纬度(仰角)向量[azimuth,elevation]。
例:用surfl指令创建一个图形,其中光源的方向为经度=-10度,纬度=50度。 surfl(peaks(200),[-10,50]); colormap(gray); shading flat
还有两个与meshc和meshz对应的函数surfc和surfz,这里不再详述。
3.11 等高线图形
MATLAB支持二维和三维等高线图形。函数contour和contour3被用来实现这种功能。它们将输入的矩阵变量M看作是定义在[1,m]*[1,n]上的函数,生成若干条常数值的等高线段。用户也可以指定等高线的条数、坐标系的比例以及某值上的等高线。
等高线的线型、顶点标记、颜色类型类似于plot函数定义。contour3适用于三维等高线的生成,调用方式与contour相同。
例:二维和三维等高线的生成。
contour(peaks,30) %生成二维等高线 % contour3(peaks,20) %生成三维等高线
3.12 改变视角view
函数view改变所有类型的二维和三维图形的图形视角。与z=0平面所成的方向角叫仰角,与x=0平
19
MatLab讲义 2002年9月版
面的夹角叫做方位角,默认的三维视角方向仰角为30度,方位角-37.5为度。而默认的二维视角仰角为90度,方位角为0度。
函数view(az,el)和view([az,el])将视角改变到所指定的方位角az和仰角rl。 例:仰角和方位角的改变。 x=linspace(0,3*pi).?
z=[sin(x) sin(2*x) sin(2*x)];
y=[zeros(size(x)) ones(size(x))/2 ones(size(x))]; %生成矩阵z,y subplot(2,2,1),plot3(x,y,z)
grid on ,xlabel(“X-axis”),ylabel(“Y-axis”),zlabel(“z-axis”) title(?默认视角:方位角=37.5,仰角=30?)
view(-37.5,30) %将视角改变到所指定的方位角-37.5和仰角30 subplot(2,2,2),plot3(x,y,z)
grid on ,xlabel(“X-axis”),ylabel(“Y-axis”),zlabel(“z-axis”) title(?方位角旋转至 52.5度?)
view(-37.5+90,30) %将视角改变到所指定的方位角52.5和仰角30 subplot(2,2,3),plot3(x,y,z)
grid on ,xlabel(“X-axis”),ylabel(“Y-axis”),zlabel(“z-axis”) title(?仰角变为60度?)
view(-37.5,60) %将视角改变到所指定的方位角-37.5和仰角60 subplot(2,2,4),plot3(x,y,z)
grid on ,xlabel(“X-axis”),ylabel(“Y-axis”),zlabel(“z-axis”) title(?方位角为0度, 仰角为90度?)
view(0,90) %将视角改变到所指定的方位角0和仰角90
3.13 透视效应hidden
MATLAB在绘制图形时,在默认方式下,前面的图形会挡住后面的图形,即消去后面的隐藏线,可用命令hidden改变这种模式。
命令格式:hidden off hidden on 例:透视图形.
subplot(1,2,1), mesh(peaks(20)+7); hidden on subplot(1,2,2), mesh(peaks(20)+7); hidden off
3.15 曲面的裁剪方法
因为曲面图不能做成透明,但在一些情况下可以很方便地移走一部分表面以便看到表面下面的部分。在MATLAB中,可以将要观察部分的数据置为特定的NaN来实现,由于NaN没有任何值,所有的作图函数都忽略NaN的数据点。即将曲面裁剪掉一部分。
例:利用NaN进行曲面裁剪 [x,y,z]=peaks(30); x1=x(1,:);y1=y(:,1); i=find(y1>0.8 & y1<1.2); j=find(x1>-.6 & x1<.5); z(i,j)=nan*z(i,j); surf(x,y,z)
3.16 四维表现和切片图slice
对于一般的定义在x,y,z坐标系上的四维可视化,可以用指令slice来实现。
为了实现三元函数r=f(x,y,z)的可视化表现,MATLAB提供了一个绘制三维物体切片图指令及与之配合的三维网格坐标生成指令。
[X,Y,Z]=meshgrid(x,y,z) % 三维网格坐标的生成 slice(X,Y,Z,V,xi,yi,zi,n) % 绘制三维物体切片图
20