7.3  三维图形

除了绘制二维图形,MATLAB还提供了一系列强大的三维图形绘制函数,这些函数的分类列表如图7-29所示。

可以看出,MATLAB基本的三维图形包括线型(line)、网格型(mesh)、区域型(area)、面型(surface)、方向矢量型(direction)、容积型(volumetric)等多种类型,图中已经将各个函数所能够绘制图形的基本样式做了小的缩略图。本节介绍常用三维绘图函数的使用。至于其他的绘图函数,因篇幅有限,这里不再介绍,请读者查阅帮助文档。

图7-29  三维图形绘制函数分类列表

7.3.1  绘制三维曲线图

在MATLAB中,plot3函数用于绘制三维曲线图。该函数的用法和plot类似,其调用语法如下。

(1)plot3(X1,Y1,Z1,...): X1、Y1、Z1为向量或者矩阵。当X1、Y1、Z1为长度相同的向量时,此函数将绘制一条分别以向量X1、Y1、Z1为x、y、z坐标的空间曲线;当X1、Y1、Z1为矩阵时,该命令以每个矩阵的对应列为x、y、z坐标绘制出m条空间曲线。

(2)plot3(X1,Y1,Z1,LineSpec,...) :通过LineSpec设置曲线和点的属性。

(3)plot3(...,'PropertyName',PropertyValue,...):利用指定的属性绘制图形。

(4)h = plot3(...):返回一个图形对象句柄的列向量。

【例7-26】  绘制三维螺旋线。

t = 0:pi/50:10*pi;

plot3(sin(t),cos(t),t)

axis square

以上代码运行的结果如图7-30所示。

图7-30  三维螺旋线

7.3.2  绘制三维曲面图

在MATLAB中,除了plot3函数可用于绘制三维图形外,还有一些函数可以用来绘制三维网格图和曲面图。下面分别介绍这些函数。

1.三维网格图

mesh函数用于绘制三维网格图,其调用语法如下。

(1)mesh(X,Y,Z):绘制出一个网格图,图像的高度由Z来决定,另外图像的颜色也由Z确定,即图像的颜色与高度成正比。如果X和Y为向量,那么length(X)= n,且

(2)ength(Y) = m,其中[m,n]= size(Z),在绘制的图形中,网格线上的点由坐标(X(j), Y(i), Z(i,j))决定。向量X对应于矩阵Z的列,向量Y对应矩阵Z的行。

(3)mesh(Z):以Z的元素为z坐标,元素对应矩阵的行数和列数分别为x和y坐标。

(4)mesh(...,C):C为矩阵。绘制出的图像的颜色由C指定。MATLAB对C进行线性变换,得到颜色映射表。如果X、Y、Z为矩阵,矩阵的维数则应该与C相同。

(5)mesh(...,'PropertyName',PropertyValue,...):利用指定的属性绘制图形。

(6)mesh(axes_handles,...):利用指定的坐标轴绘制,axes_handles为坐标轴句柄。

(7)meshc(...):创建一个匹配有二维等高线图的网格图。

(8)meshz(...):绘制出网格周围的参考面。

(9)h = mesh(...):返回一个图形对象的句柄。

【例7-27】  绘制函数的网格图。

x=-4:.2:4;y=x;

[X,Y]=meshgrid(x,y);

Z=X.^2+Y.^2;

mesh(X,Y,Z)

以上代码运行的结果如图7-31所示。

【例7-28】  绘制peaks函数的三维网格图及其在底面投影的等高线图。

[X,Y] = meshgrid(-3:.125:3);

Z = peaks(X,Y);

meshc(X,Y,Z);

以上代码运行的结果如图7-32所示。

图7-31  三维网格图图

7-32  peaks函数三维网格图及其在底面投影的等高线图

2.三维曲面图

函数surf用来绘制三维表面图形,其调用语法如下。

(1)surf(Z)和surf(Z,C):在这两个用法中,X默认为X=1:n,Y默认为Y=1:m,此时Z是一个单值函数。

(2)surf(X,Y,Z):如果X和Y为向量,那么length(X)= n,且length(Y) = m,其中[m,n]= size(Z),在绘制的图形中,网格线上的点由坐标(X(j), Y(i), Z(i,j))决定。向量X对应矩阵Z的列,向量Y对应矩阵Z的行。

(3)surf(X,Y,Z,C):通过4个矩阵参数绘制彩色的三维表面图形。其中,图形的视角由view函数值定义;图形的各轴范围由X、Y、Z通过当前的axis函数值定义;图形的颜色范围由C定义。

(4)surf(...‘PropertyName’,PropertyValue,...):设置图形表面的属性值,单个语句可以设定多个属性值。

(5)surf(axes_handles,...):利用指定的坐标轴绘制,axes_handles为坐标轴句柄。

(6)surfc(...):创建一个匹配有二维等高线图的曲面图。

(7)h = surf(...):返回一个图形对象的句柄。

【例7-29】  绘制peaks函数的曲面图。

[X,Y,Z] = peaks(30);

surfc(X,Y,Z)

colormap hsv

以上代码运行的结果如图7-33所示。

图7-33  peaks函数曲面图

7.3.3  特殊三维图形

1.三维条形图

在MATLAB中,可以使用函数bar3和bar3h来绘制三维条形,它们的调用语法与前面讲的函数bar和barh相似,这里不再赘述。

【例7-30】  使用bar3和bar3h函数绘制条形图示例。

X=rand(5,5)*10;  %  产生5×5矩阵,其中每个元素为1~10之间的随机数

subplot(221),bar3(X,'detached'),title('detached');

subplot(222),bar3(X,'grouped'),title('grouped');

subplot(223),bar3h(X,'stacked'),title('stacked');

subplot(224),bar3h(X,'detached'),title('detached');

以上代码运行的结果如图7-34所示。

图7-34  三维条形图示例

2.三维球体图

MATLAB提供了sphere函数来生成三维球体图。

【例7-31】  sphere函数使用示例。

subplot(2,2,1)

sphere(8)            %  括号中的数字指生成球体的面数,这里是指8×8

subplot(2,2,2)

subplot(2,2,3)

subplot(2,2,4)

以上代码运行的结果如图7-35所示。

3.三维饼形图

函数pie3用于绘制三维饼形图,其用法与二维饼形图函数pie基本相同。

【例7-32】  使用函数pie3绘制三维饼形图。

x=rand(1,5);               %  产生一个含有5个0~1之间的随机数构成的向量

explode=[0 1 0 0 0];      %  分离出向量x的第二个元素

pie3(x,explode)

以上代码运行的结果如图7-36所示。

图7-35  三维球体图示例图

7-36  三维饼形图示例

4.三维箭状图

函数quiver3用来绘制三维的箭状图或速度矢量图,其用法和quiver类似。

【例7-33】  绘制曲面的曲面法线。

[X,Y] = meshgrid(-2:0.25:2,-1:0.2:1);

Z = X.* exp(-X.^2 - Y.^2);

[U,V,W] = surfnorm(X,Y,Z);

quiver3(X,Y,Z,U,V,W,0.5);

surf(X,Y,Z);

colormap hsv

view(-35,45)

以上代码运行的结果如图7-37所示。

5.三维等高线图

contour3函数用于绘制一个矩阵的三维等高线图,其用法与contour函数基本相同。

【例7-34】  绘制函数的等高线图形,并使用cool颜色图。

[X,Y] = meshgrid([-2:.25:2]);   %  生成维数相同的两个矩阵X,Y

Z = X.*exp(-X.^2-Y.^2);

contour3(X,Y,Z,40)           %  绘制Z的等高线,40为等高线的数目

surface(X,Y,Z,'EdgeColor',[.8 .8 .8],'FaceColor','none')%  绘制表面图

grid off                     %  去掉网格线

view(-15,25)                %  设定视角

colormap cool               %  建立颜色图

以上代码运行的结果如图7-38所示。

图7-37  曲面法线图

图7-38  三维等高线图示例