【转】matlab图形句柄详解(一)
在matlab中,每一个对象都有一个数字来标识,叫做句柄.当每次创建一个对象时,matlab就为它建立一个唯一的句柄,句柄中包含有该对象的相关信息参数,可以在后续程序中进行操作,改变其中的参数,以便达到不同的效果。例如:gcf 是返回当前被激活的窗口的句柄。你可以认为它就指代当前窗口。
figure(gcf)打开这个窗口。
句柄式图形常用函数:
所有对象都有属性来定义它们的特征,正是通过设定这些属性来修正图形显示的方式。尽管许多属性所有的对象都有,但与每一种对象类型(比如坐标轴,线,曲面) 相关的属性列表都是独一无二的。对象属性可包括诸如对象的位置、颜色、类型、父对象、子对象及其它内容。每一个不同对象都有和它相关的属性,可以改变这些属性而不影响同类型的其他对象。和每一种对象类型(图形,坐标轴,线,文本,曲面,补片和图象)相关的完整的属性列表在本章的后面给出。
对象属性包括属性名和与它们相联关的值。属性名是字符串,它们通常按混合格式显示,每个词的开头字母大写,比如:’ LineStyle ‘ 。但是,MATLAB识别一个属性时是不分大小写的。另外,只要用足够多的字符来唯一地辨识一个属性名即可。例如,坐标轴对象中的位置属性可以用 ‘ Position ‘, ‘ position ‘ ,甚至是 ‘ pos ‘来调用。
当建立一个对象时,它用一组缺省属性值,该值可以用两种方法来改变:
改变默认属性值方法1:
» Hf_1=figure( ‘color’, ‘white’ )
它用缺省的属性值建立一个新的图形窗口,只是背景颜色被设为白色而不是缺省的[0.8 0.8 0.8](灰色)。
改变默认属性值方法2:
为了获得和改变句柄图形对象(如上面的Hf_1)的属性只需要两个函数:
函数get返回某些对象属性的当前值。
使用函数get的最简单语法是get(handle, ‘ PropertyName’ )。例如:
» p=get(Hf_1, ‘position’ )
返回具有句柄Hf_1图形窗口的位置向量。
» c=get(Hl_a, ‘color’ )
返回具有句柄Hl_a对象的颜色。
函数set改变句柄图形对象属性
使用语法set(handle, ‘PropertyName’ ,value)。例如:
» set(Hf_1, ‘Position’ ,p_vect)
将具有句柄Hf_1的图形位置设为向量p_vect所指定的值。
get
matlab help中对get函数的介绍如下:
GET Get object properties.
V = GET(H,'PropertyName') returns the value of the specified
property for the graphics object with handle H. If H is a
vector of handles, then get will return an M-by-1 cell array
of values where M is equal to length(H). If 'PropertyName' is
replaced by a 1-by-N or N-by-1 cell array of strings containing
property names, then GET will return an M-by-N cell array of
values.
GET(H) displays all property names and their current values for
the graphics object with handle H.
V = GET(H) where H is a scalar, returns a structure where each
field name is the name of a property of H and each field contains
the value of that property.
- get(h)返回句柄值h所指定的图形对象的所有属性名称与相对应的属性值
- a = get(h)返回由句柄值h所指定的图形对象的属性结构数组,并且该数组的字段名称就是该对象的属性名称。
- a = get(0,'factory')返回所有能由用户设置的属性的默认定义值。
- a = get(0,'FactoryObjectTypePropertyName1','FactoryObjectTypePropertyName2',...) 返回指定对象类型指定的属性值,输入参数FactoryObjectTypePropertyName为一个关键词,由字符Factory与图形对象类型 (如Figure)还有属性名称(如Color)组成。
- get(0,'factoryFigureColor')返回Figure对象的Color属性值。
- a = get(h,'DefaultObjectTypePropertyName1','DefaultObjectTypePropertyName1',...)返回句柄值为h的对象指定属性的默认值。如“DefaultFigureColor”。
- a = get(h,'default')列出h对象的所有属性的默认属性值
set
matlab help中对set函数的介绍如下:
SET Set object properties.
SET(H,'PropertyName',PropertyValue) sets the value of the
specified property for the graphics object with handle H.
H can be a vector of handles, in which case SET sets the
properties' values for all the objects.
SET(H,a) where a is a structure whose field names are object
property names, sets the properties named in each field name
with the values contained in the structure.
SET(H,pn,pv) sets the named properties specified in the cell array
of strings pn to the corresponding values in the cell array pv for
all objects specified in H. The cell array pn must be 1-by-N, but
the cell array pv can be M-by-N where M is equal to length(H) so
that each object will be updated with a different set of values
for the list of property names contained in pn.
SET(H,'PropertyName1',PropertyValue1,'PropertyName2',PropertyValue2,...)
sets multiple property values with a single statement. Note that it
is permissible to use property/value string pairs, structures, and
property/value cell array pairs in the same call to SET.
- a = set(h)返回句柄值h所指定的图形对象的所有属性名称对应的可设置属性值,a为结构数组,存储对象的属性名称,其字段值为相对应的属性值。属性值中用{}括起来的表示默认值。
- set(h,a)使用指定的属性值来设置由句柄值h所指定的对象属性,a为结构数组,其字段名称为对象的属性名称,字段值为相对应的属性值。
- a = set(0,'factory')返回那些用户可以设置默认值的所有对象的属性,同时显示可设置的属性值。
- a=set(0,'FactoryObjectTypePropertyName')返回所有对象中指定的属性名称FactoryObjectTypePropertyName的所有可能的属性值。
- a = set(h,'属性名','属性值')设置句柄值为h的对象的与属性名对应的属性值。
- set(h,'DefaultObjectTypePropertyName1','DefaultObjectTypePropertyName2',...)对句柄值为h的对象设置特定属性名称的属性默认值。
findobj
matlab help中对findobj函数的介绍如下:
FINDOBJ Find objects with specified property values.
H = FINDOBJ('P1Name',P1Value,...) returns the handles of the
objects at the root level and below whose property values
match those passed as param-value pairs to the FINDOBJ
command.
H = FINDOBJ(ObjectHandles, 'P1Name', P1Value,...) restricts
the search to the objects listed in ObjectHandles and their
descendents.
H = FINDOBJ(ObjectHandles, 'flat', 'P1Name', P1Value,...)
restricts the search only to the objects listed in
ObjectHandles. Their descendents are not searched.
H = FINDOBJ(ObjectHandles, '-depth', d,...) specifies the
depth of the search. It controls how many levels under the
handles in ObjectHandles are traversed. Specifying d=0 gets
the same behavior as using the 'flat' argument. Specifying
d=inf gets the default behavior of all levels.
- H = findobj;返回Root对象与其所有子对象的句柄值
- H = findobj(h);返回h变量的句柄值
- H = findobj(’属性名称‘,’属性值‘);依据对象的属性名称和属性值找出匹配的对象句柄值。
- H = findobj(ObjectHandles,’属性名称‘,’属性值‘);根据限定的对象列表找出与对象的属性名称和属性值匹配的对象句柄值
- gcf返回当前Figure对象的句柄值
gca返回当前axes对象的句柄值
gco返回当前鼠标单击的句柄值,该对象可以是除root对象外的任意图形对象,并且Matlab会把当前图形对象的句柄值存放在Figure的CurrentObject属性中
Figure对象的属性篇
(1).^是矩阵每个元素的幂乘,^是数的幂乘。
(2)set(handle)列出句柄值为handle的对象的所有属性
get(handle)除列出上述属性外,还列出可以设置的属性
reset(handle)将所有属性改为默认值
delete(handle)删除句柄值为handle的图形对象
(3)利用set(handle,‘属性名称’)获得句柄值为handle的对象的属性名称下所有可设置的属性值
set(gcf,'units):得到[ inches | centimeters | normalized | points | {pixels} | characters ],其中,大括号中是默认值
(4)clf reset;将窗口关闭,并重新设置其属性为默认值。
(5)Closerequestfcn,有效值为字符串或函数句柄(前加@)
当关闭绘图窗口或离开Matlab时,就会定义Closerequestfcn定义的函数
(6)createfcn, 当Matlab建立一个对象时(如为figure对象,即打开一个绘图窗口),就会触发createfcn所定义的callback程序。如 set(0,'defaultfigurecreatefcn','set(gcbo,''integerhandle'',''off'')');即设 置了根对象的默认值,使每次建立figure对象时,都会指定一个非整数的句柄值。(在用户未指定句柄值时)
(7)将当前窗口中在键盘上按下的按键名显示出来。
set(gcf,'keypressfcn','get(gcf,''currentcharacter'')')
(8)color有效值为colorspec
colorspec表:
RGB 简称
[110] y_yellow
[101] m_magenta
[011] c_cyan
[100] r_red
[010] g_green
[001] b_blue
[111] w_white
[000] k_black
(9)linspace(a,b,c):a初始b结束c线性分段次数linspace(a,b)则默认100次
(10)CurrentObject:有效值为图形对象句柄值:返回绘图窗口内当前被鼠标选取的对象的句柄值
(11)currentPoint:有效值[x-坐标,Y-坐标]返回绘图窗口中最后单击鼠标的位置,用get(gcf,'currentpoint')就会返回当前在窗口中单击鼠标的位置
(12)DeleteFcn:有效值:字符串或函数句柄,删除对象(这里为figure)时会触发Deletefcn所定义的Callback程序。
(13)Dockcontrols:有效值为on/off,默认值on,控制窗口的嵌入效果是否可用。
(14)Hittest:有效值on/off,决定能否用鼠标选取对象为当前对象。
(15)Integerhandle:有效值on/off,决定Figure对象句柄值的类型为整数或浮点小数。
(16)Interruptible: 有效值on/off,执行过程中需要中断程序而优先执行其他程序时要设该属性为on。即Interrupptible属性是用以控制当Callback执 行时是否能被其他事件(如此时鼠标按下其他控制对象)而中断,on是会中断,off时会执行完当前Callback,再去执行其他Callback。
(17)Keypressfcn:有效值为字串或函数句柄。当用户在figure窗口中按下键盘的任意键时,就会执行Keypressfcn所定义的Callback程序。
figure('keypressfcn','fprintf('' 当前按下键盘上的%c键\n'',get(gcf,''currentcharacter''))')在这个figure窗口中按下键盘上的按键时就会立 即返回对应的字符,依据这个效果就可以决定当字符键被按下时所要执行的操作。
当这个属性指定的值是一个函数句柄时,Matlab就会将这个函数 视 为一个结构,包含下列字段——character(以当前键盘上按下的按键显示的字符来当作结果),modifier(包含一个或多个识别键盘上按下按键 字符名称的细胞数组(如Ctrl,Alt,Shift等),key(显示被按下的键)。
(18)WindowButtonDownFcn:有效值为字符串或函数句柄
当鼠标在绘图窗口内按下鼠标任意键时,将触发WindowButtonDownFcn所定义的Callback以产生相对应的操作。
(19)WindowButtonMotionFcn:有效值为字符串或函数句柄
当鼠标在绘图窗口内按住鼠标任意键移动,将触发WindowButtonMotionFcn所定义的Callback以产生相对应的操作。
(20)WindowButtonUpFcn:有效值为字符串或函数句柄
当鼠标在绘图窗口内释放鼠标任意键时,将触发WindowButtonUpFcn所定义的Callback以产生相对应的操作。
(21)CurrentAxes有效值为当前坐标轴的句柄值,返回当前的坐标轴句柄值。假设某坐标轴句柄值为a_h,可以使用axes(a_h)或set(gcf,'currentaxes',a_h)这两种方式,制定句柄值为a_h的坐标轴为当前坐标轴。
(22)CurrentCharacter:有效值为任意字符,返回用户在绘图窗口中最后输入的一个字符,即刚在键盘上按下的字符键将存储到Currentcharacter中,一般于Keyppressfcn合用。
(23)Currentobject有效值为图形对象的句柄值,返回绘图窗口内当前被鼠标选取的对象的句柄值。
(24)有效值为两元素的向量,[X坐标,Y坐标]
返回绘图窗口中最后单击鼠标的位置,与Windowbuttonmotionfcn,Windowbuttonupfcn合用。使用get(gcf,'currentpoint')就会返回当前在窗口中单击鼠标的位置。
Axes对象的属性
(1)title('new','color','r');给坐标轴命名为new,红色
title({'this title','has 2 '});命名为两行的标题
(2)Units:有效值为pixels/normalized/inches/centimeters/points/characters
决定各种位置属性的度量单位,相对于窗口左下角为基准。当设置为Pixels时,以像素为单位;当设置为normalized时,以坐标为单位,屏幕的左下角为[0,0],右上角为[1.0,1.0]。
(3)grid on:在图像中显示网格。
(4)children:控制axes对象的子对象,即image\light\line\patch\rectangle\surface和text等对象,可通过get(gca,'children')来返回当前坐标轴的子对象构成的句柄值向量。
(5)字体属性:
Fontangle字体角度(正常normal或斜体italic/oblique)
Fontname字体名称
fontsize字体大小(单位由Fontunits决定)
fontunits字体单位(points/normalized/inches/centimeters/pixels)
fontweight字体粗细(normal/bold/light/demi)
gridlinestyle决定坐标轴网格线的样式,‘-’为实线‘- -’为虚线‘:’为点线‘-.’为点虚线
plot(1:10);grid on;set(gca,'gridlinestyle','-.');将当前坐标轴显示的网格线为点-虚线
(6)linewidth 定义X,Y和Z轴的轴线宽度(以点单位定义)
(7)NextPlot:有效值为add|replace|replacechildren,默认为replace
add 表示使用当前的坐标轴,把新的图形对象加到此坐标轴中是一般保留的做法,replace表示重新设置坐标轴的所有属性(Position除外),也就是在 绘图前会删除当前坐标轴和它的子对象。replacechildren表示移除当前坐标轴中所有子对象,但不重新设置坐标轴的所有属性
(8)Outerposition决定坐标轴外边界的位置。由位置向量[left,bottom,width,height]组成,其中left,bottom表示相对于绘图窗口左下角的位置,width,height表示区域尺寸,默认为[0 0 1 1]
(9)Position由位置向量[left,bottom,width,height]组成,决定坐标轴位置
(10)Tag定义本坐标轴的卷展栏,因为每一个对象都有自己唯一的识别码即tag,以方便findobj函数查找坐标轴句柄值。
(11)visible决定坐标轴是否可见
(12)set(gca,'xgrid','on')绘制X轴垂直网格线
set(gca,'gridlinestyle',':','linewidth',3)设置网格线线条类型和宽度
set(gca,'box','on')将图轴方框绘制出来
(13)set(gca,'xscale','linear');将X轴刻度设为线性
set(gca,'yscale','log');将Y轴刻度设为对数
(14)disp()显示一个数组,但不显示其数组名称
disp(' Corn Oats Hay')
disp(rand(5,3))
which results in
Corn Oats Hay
0.2113 0.8474 0.2749
0.0820 0.4524 0.8807
0.7599 0.8075 0.6538
0.0087 0.4832 0.4899
0.8096 0.6135 0.7741
Pause:pause, by itself, causes M-files to stop and wait for you to press any key before continuing.
实例:plot(1:10);set(gca,'yscale','log');
disp('请按下Enter键');
pause
set(gca,'Yscale','linear');本例是说按下Enter键将Y轴刻度由对数改为线性。
(16)Xtick,Ytick,Ztick:控制X,Y,Z轴坐标刻度记号的位置,即控制坐标轴上刻度记号的位置以及每隔多少值会到下一个刻度记号的位置,同时还需要配合Xticklabel、Yticklabel、Zticklabel属性来调整。详细见例程。
以下设置方式相同:
set(gca,'Xticklabel',{'1';'10';'100'})
set(gca,'Xticklabel','1|10|100')
set(gca,'Xticklabel',[1;10;100])
set(gca,'Xticklabel',['1 ';'10 ';'100'])
(17)Findobj:查找
Line对象
当 用户建立一个线对象时,就会触发Createfcn所定义的Callback产生相对应的操作;同样,若删除一个线对象时,就会触发DeleteFcn所 定义的Callback产生相对应的操作。以下程序建立一个线对象,并设置DeleteFcn为一个问题对话框,当删除该线对象时,就会显示其问题对话框 来询问用户。
(1) clipping:有效值为on/off,默认值为on
设置坐标轴土筐是否可以剪辑,如果设为off,则绘制线对象时可超出坐标轴的图框。
(2)Linewidth:有效值为纯量(与向量相对,只有大小而无方向),点为单位。
(3)Marker:有效值为字符,决定Line对象的记号类型,有+,o,*,.,x,s,d,等
(4)Markersize:有效值为纯量,单位为点,Marker的大小。
(5)UIcontextmenu: 有效值为uicontextmenu对象的句柄值,定义与线对象相关联的uicontextmenu菜单,因此当用户将该线对象的属性 UicontextMenu设置为相关联的uicontextmenu对象的Tag名称时,uicontextmenu就可以在该线对象上单击鼠标右键来 显示uicontextmenu菜单。
(6)Tag:有效值为字符串,定义改线对象的卷展栏(即标记)
(7)Type:有效值为字符串(只读),此处为’line‘字符串。
(8)Xdata,Ydata,Zdata:有效值为坐标数组,指定产生线条的数据点,若为2D环境则Xdata、Ydata需要有相同数目的数据,而Zdata为空矩阵;3D环境则Xdata,Ydata,Zdata三者都需要有相同数目的数据。
例:x=0:5,y=x+10;line('xdata',x,'ydata',y);
Patch对象
patch函数不想其他高级区域建立函数(fill和area),只是简单地将patch对象添加到当前坐标轴中而已。
使用:patch(X,Y,C)
在当前的坐标轴中添加二维填充的patch对象,X和Y用以定义patch对象顶点的位置,若X,Y为矩阵,则Matlab按每一行的元素来产生多个多边形。
例:x = [0 0;0 1;1 1];
y = [1 1;2 2;2 1];
z = [1 1;1 1;1 1];(x(1,1),y(1,1),z(1,1)为第一个面的第一个顶点,x(2,1),y(2,1),z(2,1)为第一个面的第二个顶点,以此类推)
tcolor(1,1,1:3) = [1 1 1];
tcolor(1,2,1:3) = [.7 .7 .7];
patch(x,y,z,tcolor);(tcolor是一个1*2*3的三维矩阵)
Surface对象
surface可以建立一个surface对象,surface是由矩阵数据所在的列索引值为X坐标,而行索引值为Y坐标,并且矩阵的每个元素值为Z坐标。
image对象
image(C)将矩阵C当作一个图像来显示,C的每一个元素定义一个图像中矩阵线段的颜色。
image(x,y,C)其中x与y为2元素的向量,分别指定X轴与Y轴卷展轴的范围。C为图像矩阵。
text对象
(1)text(x坐标,y坐标,'string')在图形中指定位置(x,y)显示字符串string。
(2)Editing有效值为on/off,off时,用户在执行GUI操作时无法直接在该Text对象上进行编辑,改为on后,可以进行编辑。
(3)HorizontalAlign 有效值为left/center/right决定Text对象中字符水平方向的对齐方式。
(4)Interpreter 有效值为tex/none,决定Text对象中是否可用Tex字符注释,当设置为Tex时,表示允许用户能够在String属性下输入Tex字符。以下为 在窗口的 [.5 .5]点位置处建立一个text对象并且字体大小以16点来表示的一个方程式。(显示的是一个二重积分)
text('interpreter','latex','string','$$\int_0^x\!\int_y dF(u,v)$$','position',[.5 .5],'fontsize',16)
(5)String有效值为字符串,表示要显示出来的字符串是什么。
(6)verticalAlignme 有效值为top/cap/middle/baseline/bottom决定Text对象垂直对齐的方式。
下面加载一个例子,是ilovematlab论坛一个斑竹的回复
x=0:0.5:10;
>> y1=sin(x);
>> y2=cos(x);
>> plot(x,y1,'r',x,y2,'g')
>> findobj(gca,'color','r')
不想要的曲线直接delete句柄就可以了