- 计算机仿真技术与CAD
- 李国勇主编
- 4603字
- 2020-08-27 08:18:43
1.4 MATLAB的绘图功能
MATLAB被控制界广泛接受的另一个重要原因是,它提供了十分方便的一系列绘图命令。例如,线性坐标、对数坐标、半对数坐标及极坐标等命令,它还允许用户同时打开若干图形窗口,对图形标注文字说明等,它使得图形绘制和处理等复杂工作变得简单得令人难以置信。
1.4.1 二维图形
1.基本形式
MATLAB最基本的绘图函数为plot()。
如果y是一个n维行向量或列向量,那么plot(y)将绘制一个y元素和y元素排列序号1,2,…,n之间关系的线性坐标图。如y是一个n ×m维矩阵,那么plot(y)将同时绘出每列元素与其排列序号1,2,…,n之间关系的m条曲线。例如
>>y=[0 0.48 0.84 1 0.91 0.6 0.14];plot(y)
则显示如图1-2所示的简单曲线。
图1-2 简单曲线
如果x和y是两个等长向量,那么plot(x,y)将绘制一条x和y之间关系的线性坐标图。例如,利用以下命令可显示如图1-3所示正弦曲线。
>>x=0:0.01:2*pi;y=sin(x);plot(x,y)
图1-3 正弦曲线
2.多重线型
在同一图形中可以绘制多重线型,其基本命令格式为
plot(x1,y1,x2,y2,…,xn,yn)
其中,向量x1,x2,…,xn为x轴变量;向量y1,y2,…,yn为y轴变量。
以上命令可将x1对y1,x2对y2,…,xn对yn的图形绘制在一个图形中,而且分别采用不同的颜色或线型。例如,利用以下命令可显示如图1-4所示的正余弦曲线。
>>x=0:0.1:2*pi;plot(x,sin(x),x,cos(x))
当plot()命令作用于复数数据时,通常虚部是忽略的。然而有一个特殊情况,即当plot()只作用于单个复变量z时,则实际绘出实部对应于虚部的关系图形(复平面上的一个点)。即这时plot(z)等价于plot(real(z),image(z)),其中z为矩阵中的一个复向量。
图1-4 正余弦曲线
表1-6 MATLAB中绘图命令的各种选项
3.图形修饰及文本标注
MATLAB中对于同一图形中的多重线,不仅可分别定义其线型,而且可分别选择其颜色,带有选项的曲线绘制命令的调用格式为
plot(x1,y1,选项1,x2,y2,选项2,…,xn,yn,选项n)
其中,向量x1,x2,…,xn为x轴变量;向量y1,y2,…,yn为y轴变量。选项如表1-6所示。
表1-6中的线型和颜色选项可以同时使用。例如
>>x=0:0.1:2*pi;plot(x,sin(x),′-g′,x,cos(x),′-.r′)
绘制完曲线后,MATLAB还允许用户使用它提供的特殊绘图函数来对屏幕上已有的图形加注释、题头或坐标网格。例如
>>x=0:0.1:2*pi;y=sin(x);plot(x,y) >>title(′Figure Example′) %给出题头 >>xlabel(′This is x axis′) %x轴的标注 >>ylabel(′This is y axis′) %y轴的标注 >>grid %增加网格
除了在标准位置书写标题和轴标注以外,MATLAB还允许在图形窗口的位置利用line()和text()命令画直线或写字符串,它们的调用格式分别为
line(x,y)和text(x,y,chstr,选项)
其中,line()函数在给定的图形窗口上绘制一条由向量x和y定义的折线;text()函数是在指定的点(x,y)处写一个chstr绘出的字符串;而选项决定x,y坐标的单位,如选项为‘sc’,则x,y表示规范化窗口的相对坐标,其范围为0到1,即左下角坐标为(0,0),而右上角的坐标为(1,1)。如省略选项,则x,y坐标的单位和图中是一致的。例如
>>text(2.5,0.7,′sin(x)′)
用text()命令可以在图形中的任意位置加上文本说明,但是必须知道其位置坐标;而利用另一个函数gtext(),则可以用鼠标来对要添加的文本字符串定位。在MATLAB的工作空间中键入下列命令:
>>gtext(′sin(x)′)
则在图中将出现一个十字叉,用鼠标将它移动到添加文本的位置,单击鼠标,gtext(′sin(x)′)命令中的文本字符串“sin(x)”就自动添加到指定的位置。
4.图形控制
MATLAB允许将一个图形窗口分割成n ×m个部分,对每一部分可以用不同的坐标系单独绘制图形。窗口分割命令的调用格式为
subplot(n,m,k)
其中,n和m分别表示将这个图形窗口分割的行和列数;k表示每一部分的代号。例如,想将窗口分割成4 ×3个部分,则右下角的代号为12,MATLAB最多允许9 ×9的分割。
尽管MATLAB可以自动根据要绘制曲线数据的范围来选择合适的坐标系,使得曲线能够尽可能清晰地显示出来,但是,如果觉得自动选择的坐标仍不合适,则可以用手动的方式来选择新的坐标系。调用函数的格式为
axis([xmin,xmax,ymin,ymax])
另外,MATLAB还提供了清除图形窗口命令clf、保持当前窗口的图形命令hold、放大和缩小窗口命令zoom等。
5.特殊坐标图形
除了基本的绘图命令plot()外,MATLAB还允许绘制极坐标曲线、对数坐标曲线、条形图和阶梯图等,其常用的函数如表1-7所示。
表1-7 特殊二维曲线绘制函数
表1-7中参数x,y分别表示横、纵坐标绘图数据;c表示颜色选项;ym,yM表示误差图的上下限向量;n表示直方图中的直条数,默认值为10。
(1)极坐标曲线绘制函数的调用格式为
polar(theta,rho,选项)
其中,theta和rho分别为长度相同的角度向量和幅值向量;选项的内容和plot()函数的基本一致。
(2)对数和半对数曲线绘制函数的调用格式分别为
semilogx(x,y,选项) %绘制横轴为对数标度的图形,选项同plot() semilogy(x,y,选项) %绘制纵轴为对数标度的图形,选项同plot() loglog(x,y,选项) %绘制两个轴均为对数标度的图形,选项同plot()
函数semilogx()仅对横坐标进行对数变换,纵坐标仍保持线性坐标;而semilogy()只对纵坐标进行对数变换,横坐标仍保持线性坐标;loglog()则对横、纵坐标都进行对数变换(最终得出全对数坐标曲线)。选项的定义与plot()函数的完全一致。
【例1-6】 利用图形窗口分割方法将极坐标方程
ρ=cos(θ/3)+1/9
用四种绘图方式画在不同的窗口中。
解 MATLAB程序ex1_6.m如下
%ex1_6.m theta=0:0.1:6*pi;rho=cos(theta /3)+1/9; subplot(2,2,1);polar(theta,rho); subplot(2,2,2);plot(theta,rho); subplot(2,2,3);semilogx(theta,rho);grid subplot(2,2,4);hist(rho,15)
则显示如图1-5所示曲线。
(3)与线性坐标向量的选取不同,在MATLAB下还给出了一个实用的函数logspace()按对数等间距的分布来产生一个向量,该函数的调用格式为
x=logspace(n,m,z)
其中,10n和10m分别表示向量的起点和终点;而z表示需要产生的向量点个数,当忽略该参数时,z为默认值50。
图1-5 绘图窗口的分割与不同图形绘制
6.函数图形
MATLAB还允许调用函数fplot()或ezplot()来直接绘制出函数的图形,其函数的调用格式为
fplot(f,[a,b],N)和ezplot(f,g,[a,b],N)
其中,f,g为函数名,它们既可为自定义的任意M函数,也可为基本数学函数;[a,b]为绘图区间;N为点数,默认时将取N=25。
例如绘制如图1-3所示的正弦函数在一个周期内的曲线,可采用如下命令
>>fplot(′sin′,[0,2*pi])
利用函数ezplot()可以直接绘制隐函数曲线,隐函数即满足方程f(x,y)=0的x,y之间的关系式。因为很多隐函数无法求出x,y之间的关系,所以无法先定义一个x向量再求出相应的y向量,从而不能采用plot()函数来绘制其曲线。另外,即使能求出x,y之间的显式关系,但不是单值绘制,则绘制起来也是很麻烦的。
【例1-7】 试绘制隐函数f(x,y)=x2 sin(x+y2)+y2 ex+y+5cos(x2 +y)=0的曲线。
解 MATLAB命令如下。
>>ezplot(′x^2*sin(x+y^2)+y^2*exp(x+y)+5*cos(x^2+y)′)
执行以上MATLAB命令,结果显示如图1-6所示曲线。
7.利用鼠标绘制图形
MATLAB允许利用鼠标来点选屏幕点,命令格式为
[x,y,button] =ginput(n)
其中,n为选择点的数目,返回的x,y向量分别存储被点中的n个点的坐标,而button亦为一个n维向量,它的各个分量为鼠标键的标号,如button(i)=1,则说明第i次按下的是鼠标左键,而该值为2或3则分别对应于中键和右键。
【例1-8】 用鼠标左键绘制折线,同时在鼠标左键点中的位置输出一个含有该位置信息的字符串,利用鼠标中键或右键中止绘制。
图1-6 隐函数曲线
解 MATLAB程序ex1_8.m如下。
%ex1_8.m clf;axis([0,10,0,5]);hold on %清除图形窗口,并定义坐标轴范围和保护窗口内容不被删除 x=[];y=[]; for i=1:100 [x1,y1,button] =ginput(1); chstr=[′(′,num2str(x1),′,′,num2str(y1),′)′];text(x1,y1,chstr); x=[x,x1];y=[y,y1];line(x,y) if(button~=1);break;end end hold off %取消窗口保护
1.4.2 三维图形
1.三维曲线绘制
与二维曲线相对应,MATLAB提供了plot3()函数,它允许在一个三维空间内绘制出三维的曲线,该函数的调用格式为
plot3(x,y,z,选项)
其中,x,y,z为维数相同的向量,分别存储曲线的三个坐标的值,选项的意义同plot()函数。
例如利用以下命令,可得到图1-7 所示曲线。
图1-7 三维图形
>>t=0:pi/50:10*pi;plot3(sin(t),cos(t),t)
2.三维曲面绘制
如果已知二元函数z=f(x,y),则可以绘制出该函数的三维曲面图。在绘制三维图之前,应该先调用meshgrid()函数生成网格矩阵数据x和y,然后可以按函数公式用点运算的方式计算出z矩阵,最后就可以用mesh()等函数进行三维图形绘制了。
MATLAB提供的mesh()函数用于绘制三维表面网格图,该函数的调用格式为
mesh(x,y,z,c)
其中,x,y,z分别构成该曲面的x,y和z向量;c为颜色矩阵,表示在不同的高度下的颜色范围,如果省略此选项,则会自动地假定c=z,亦颜色的设定是正比于图形的高度的,这样就可以得出层次分明的三维图形来。
【例1-9】 试绘制二元函数z=f(x,y)=(x2 -2x)e -x2-y2-xy的曲线。
解 MATLAB命令如下。
>>[x,y] =meshgrid(-3:0.1:3,-2:0.1:2); >>z=(x.^2-2*x).*exp(-x.^2-y.^2-x.*y);mesh(x,y,z)
执行以上命令便可得到图1-8所示的曲线。
图1-8 三维表面网格图
关于三维图形的绘制,常用的其他命令有
surf(x,y,z) %绘制三维表面图形 surfc(x,y,z) %绘制带有等高线的三维表面图形 surf1(x,y,z) %绘制带有阴影的三维表面图形 waterfall(x,y,z) %绘制瀑布形三维图形 contour(x,y,z) %等高线图形。
3.三维图形视角设置
MATLAB三维图形显示中提供了修改视角的功能,允许用户从任意的角度观察三维图形,实现视角转换有两种方法。其一是使用图形窗口工具栏中提供的三维图形转换按钮来可视地对图形进行旋转;其二是用view()函数有目的地进行旋转。
函数view()的调用格式为
view(α,β)
其中,方位角α为视点在x-y平面投影点与y轴负方向之间的夹角,默认值为-37.5 °;方位角β为视点和x-y平面的夹角,默认值为30 °。例如,俯视图可以由view(0,90)来设置;正视
图可以由view(0,0)来设置;俯视图可以由view(90,0)来设置。
【例1-10】 试在同一窗口中绘制二元函数z=f(x,y)=(x2 -2x)e -x2-y2-xy曲面的三视图和三维表面图形。
解 MATLAB命令如下。
>>[x,y]=meshgrid(-3:0.1:3,-2:0.1:2);z=(x.^2-2*x).*exp(-x.^2-y.^2-x.*y); >>subplot(2,2,1);surf(x,y,z);view(0,90);subplot(2,2,2);surf(x,y,z);view(90,0); >>subplot(2,2,3);surf(x,y,z);view(0,0);subplot(2,2,4);surf(x,y,z);
执行以上命令便可得到图1-9所示曲线。
图1-9 二元函数的三视图与表面图
1.4.3 图像处理
MATLAB提供了简单的图像输入输出功能,而图像处理工具箱提供了图像处理的强大功能。这里由于篇幅限制,仅介绍简单的入门知识。
(1)读图像文件
图像文件读取函数imread()的调用格式为
W=imread(文件名)
该命令将文件中的图像读入MATLAB工作空间,生成8位无符号整型三维数组W,其中W(:,:,1),W(:,:,2)和W(:,:,3)分别对应于彩色图像的红色、绿色和蓝色分量。如果文件中存储的是灰度图像,则W为矩阵,存储图像的像素值。
(2)图像显示
MATLAB及其图像处理工具箱中提供了多个图像显示函数,如image(),imview(),ims-how()和imtool(),它们各有特色。
(3)图像颜色空间转换
彩色图到灰度图的转换可以由函数rgb2gray()完成。另外,不同颜色空间的图像可以通过rgb2hsv(),hsv2rgb()等进行转换。
(4)图像边缘提取
图像边缘提取是图像识别的重要基础工作。利用MATLAB中的edge()函数,可以提取图像边缘,该函数的调用格式为
W1=edge(W,m)
其中,W为灰度图像矩阵;m为提取算法,可以选择′canny′和′sobel′等不同算法,默认算法为Canny算法。