第五讲matlab句柄绘图和GUI——matlab语言的句柄绘图可以对图形各基本对象进行更为细腻的修饰,可以产生更为复杂的图形,而且为动态图形的制作奠定了基础。高层绘图与底层绘图的区别•高层绘图函数——是对整个图形进行操作的,图形每一部分的属性都是按缺省方式设置的,充分体现了matlab语言的实用性。•底层绘图函数——可以定制图形,对图形的每一部分进行控制,用户可以用来开发用户界面以及各专业的专用图形。充分体现了matlab语言的开发性。一、什么是句柄图形•句柄图形:利用底层绘图函数,通过对对象属性的设置(HandleGraphics)与操作实现绘图。•句柄图形是一种面向对象的绘图系统,其中所有图形操作都是针对图形对象而言的。•句柄图形充分体现了面向对象的程序设计。•之前介绍的高层图形指令(如plot)都是以句柄图形软件为基础写成的。也正是这个原因,句柄图形也被称为底层(Low-level)图形。•句柄图形的功能句柄图形可以随意改变matlab生成图形的方式。句柄图形允许你定制图形的许多特性,无论是对图形做一点小改动,还是影响所有图形输出的整体改动。句柄图形可以直接创建线、文字、网格、面以及图形用户界面。二、图形对象和句柄1.图形对象——matlab把用于数据可视和界面制作的基本绘图要素称为句柄图形对象(Handlegraphicsobject),它是图形系统中最基本、最底层的单元,每个图形对象可以被独立地操作。在matlab中生成的每个具体图形,由若干不同对象构成。每个具体图形不必包含全部对象,但每个图形必须具备根屏幕和图形窗。父对象子对象图形对象的基本要素以根屏幕为先导图形对象之间的关系为父代与子代的关系窗口1窗口n窗口2界面控制界面菜单轴线面字块像根屏幕说明:根:图形对象的根,对应于计算机屏幕,根只有一个,其它所有图形对象都是根的后代。图形窗口:根的子代,窗口的数目不限,所有图形窗口都是根屏幕的子代,除根之外,其它对象则是窗的后代。界面控制:图形窗口的子代,创建用户界面控制对象,使得用户可采用鼠标在图形上作功能选择,并返回句柄。界面菜单:图形窗口的子代,创建用户界面菜单对象轴:图形窗口的子代,创建轴对象,并返回句柄,线面字块像的父辈线:轴的子代,创建线对象面:轴的子代,创建块对象字:轴的子代,创建字对象块:轴的子代,创建块对象像:轴的子代,创建图像对象01234567-1-0.8-0.6-0.4-0.200.20.40.60.81窗口对象线对象轴对象0102001020-10010-505-1-0.500.51x=-pitppicos(x)valueofthecosinecos(x)=0.7071002003000501001502000-1-0.500.51面对象轴对象像对象块对象线对象文字对象2.创建图形对象的底层函数•figure创建图形窗口调用格式:h=figure(n)n为窗口序号•uicontrol图形界面控制调用格式:h=uicontrol(‘property’,value)property/value确定控制类型•uimenu创建用户界面菜单调用格式:h=uimenu(‘property’,value)property/value确定菜单形式。•axes创建轴对象h=axes(‘property’,)定义轴对象的位置与大小left,bottomwidth,height例:axes('position',[0.10.10.50.2])x=0:0.5:10;y=x;plot(x,y)还有axis命令,定义了轴的位置、宽度和高度。例:axis([010210])注意二者的区别•line创建线对象h=line(x,y,z)•patch创建块对象h=patch(x,y,z,c)x,y,z定义多边形,c确定填充颜色。•surface创建面对象,是底层函数h=surface(x,y,z,c)x,y,z三维曲面坐标,c颜色矩阵。而surf是高级函数。二维画线三维画线light灯光对象•函数light创建一个灯光源。一个灯光源含三个因素:颜色、风格、位置。•调用:light('color',[1,1,1],'style',localorinfinite,'position',[x,y,z])•本地光:X,Y,Z表示光源位置。无穷远光:X,Y,Z表示无穷远光通过该点射向原点。例:subplot(2,2,1)membrane%这是一个库函数light('color',[0.90.50.1],'position',[0,-2,1])%风格省略为无穷远,光顺序通过(000)和(0-21)subplot(2,2,2)membranelight('color',[0.90.00.1],'style','local','position',[1,-1,1])%风格为本地光,光源在(1-11)位置•image显示图象h=image(x);x为图像矩阵•text标注文字对象h=text(x,y,'string')例:h=text(0.1,0.2,'superstar')每个底层函数只能创建一个图形对象,并将它们置于适当的父辈对象中。确定标注位置标注字符串3.图形对象的属性※图形对象是由属性来描述的,可以通过修改属性来控制对象外观、行为等诸多特征。※用户不但可以查询当前任意对象的任意属性值,而且可以指定大多数属性的取值。※在高层绘图中对图形对象的描述一般是省缺的或由高层绘图函数自动设置的,因此对用户来说几乎是不透明的。※但句柄绘图中上述图形对象都是用户需要经常使用的,所以要作到心中有数,用句柄设置图形对象的属性。•什么是句柄?句柄是图形对象的标识代码(唯一的身份),标识代码含有图形对象的各种必要的属性信息。•各图形对象的句柄数据格式:根屏幕0图形窗口正整数,表示图形窗口序号其它对象对应的双精度浮点数4.句柄(handle)与句柄操作•所有能创建图形对象的matlab函数都可给出所创建图形对象的句柄例:创建1号窗口,返回句柄h=figure(1)h=1返回值为窗口号数h=figure('color',[10.10],'position',[00200100],'name','ww')例:h=line(1:6,1:6)创建线对象的同时也建立了一个唯一的句柄变量h是句柄值——符点数•句柄属性的设置与修改get:获得句柄图形对象的属性和返回某些对象的句柄值get(gca,’属性’)返回当前坐标的单项属性值set:改变图形对象的属性•专用函数:gcf:当前窗口对象的句柄GetCurrentFiguregca:当前轴对象的句柄GetCurrentAxesget(gca)返回当前坐标的所有属性值二、图形对象属性的获得与设置•操作格式:h=gcf将当前窗口对象的句柄返回hget(h)或get(gcf)查阅当前窗口对象的属性delete(gcf)删除当前窗口的属性例:h=line(x,y)1.get(h)2.get(gca,'children')轴的子代例:创建一个线对象并返回线对象的句柄值•h1=line([0:10],[0:10])h1=57.0001h1为句柄的代码值012345678910012345678910•查阅线对象的属性名称和属性值get(h1)Color=[110]EraseMode=normalLineStyle=-LineWidth=[0.5]MarkerSize=[6]Xdata=[(1by11)]Ydata=[(1by11)]Zdata=[]ButtonDownFcn=Children=[]Clipping=onInterruptible=noParent=[56.0001]Type=lineUserData=[]Visible=on•根据轴是线对象的父代,可查轴的句柄get(gca)•可查色序get(gca,'colororder')ans=110101011100010001•设置线条和窗口的颜色set(h1,'color',[100])set(h1,'color',[10.50])02468100123456789100246810012345678910set(gcf,'color',[0.50.50.5])set(gcf,'color',[0.50.60.8])012345678910012345678910012345678910012345678910例:作正弦、余弦曲线,将正弦曲线改为虚线,将余弦曲线幅度减为1/2高度,如何用句柄实现。x=0:2*pi/180:2*pi;y1=sin(x);y2=cos(x);plot(x,y1,x,y2,x,zeros(size(x)),':')01234567-1-0.500.5101234567-1-0.8-0.6-0.4-0.200.20.40.60.81•首先查询各对象的属性get(gcf)···h=get(gcf,'children')h=60.0004hh=get(gca,'children')hh=70.000469.000468.000401234567-1-0.500.5101234567-1-0.8-0.6-0.4-0.200.20.40.60.81•修改属性y11=get(hh(2),'ydata');y22=y11/2;set(hh(2),'ydata',y22)set(hh(3),'linestyle',':')※控制一个图形对象是通过句柄实现的,具体是通过句柄操作函数get,set将某对象句柄属性作设置与修改。1.对象属性的直接操作对象属性的直接操作是通过当前句柄来实现的,所以首先要获得当前句柄值以及对象的属性,然后再查询或修改。三、对象的属性操作get(h)get(h,'propertyname')set(h)set(h,'propertyname',value)set(h,'属性名称','新属性')'color','r‘'linestyle',':''figurecolor','m'2.对象属性的继承操作•对象属性的继承操作是通过父代对象,设置省缺对象属性来实现的。•父代句柄属性中设置缺省值后,所有子代对象均可以继承该属性的省缺值。•属性省缺值的描述结构为:Dfault+对象名称+对象属性如:DefaultFigureColor——图形窗口的颜色DefaultAxesAspaceRatio——轴的视图比率DefaultLineLineWide——线的宽度DefaultLineColor——线的颜色※省缺值的获得与设置也是由get,set函数实现的例:get(0,'DefaultFigureColor')——获得图形窗口的省缺值set(h,'DefaultLineColor','r')——设置线的颜色为红色例:在图上添加文字注释,颜色为红色set(gca,'DefaultTextColor',[100])gtext('正弦')gtext('余弦')%鼠标取点•在轴对象上设置字对象的颜色省缺值为红色•继承该省缺值在图上添加红色的文字注释例:在轴对象上(父代对象)设置线的颜色省缺值为红色x=0:2*pi/180:2*pi;y=sin(2*x);set(gca,'DefaultLineColor',[100]);h=line(x,y)h=68.0001set(h,'color','default')%变成缺省的红色01234567-1-0.8-0.6-0.4-0.200.20.40.60.8101234567-1-0.8-0.6-0.4-0.200.20.40.60.81例:x=0:2*pi/180:2*pi;y=sin(2*x);h=line(x,y)set(0,'DefaultFigureColor',[0.50.50.5])——将所有新图形窗口的颜色由省缺值黑色设置为适中的灰色01234567-1-0.500.51set(h,'color','m','linewidth',2,'line