第二十章句柄图形 什么是句柄图形?句柄图形是对底层图形例程集合的总称,它实际上进行生成图形的工作。 这些细节通常隐藏在图形M文件的内部,但如果想使用它们也是可得到的 MATLAB用户指南给人的一种印象是,句柄图形非常复杂,只对熟练的高级用户才有用。 而实际上不是这样的。句柄图形可以被任何人用来改变 MATLAB生成图形的方式,不论是只 想在一幅图里做一点小变动,还是想做影响所有图形输出的全局变动 句柄图形允许你定制图形的许多特性,而这用高级命令和前几章里描述的函数是无法实现 的。例如,如果想用橘黄色来画一条线,而不是plot命令中可用的任何一种颜色,该怎么做呢? 句柄图形就可以提供一种方法。 本章不对句柄图形作详细讨论,因为那样涉及问题太细。这里的目的只是对句柄图形概念 作基本了解,并提供足够多的信息,使得即使是偶尔使用一下 MATLAB的用户也可以利用句 柄图形。在这个背景下,在本章最后给出了关于句柄图形对象属性和它们的值,它不仅很有用 也很有意义 20.1谁需要句柄图形? 开始,我们要强调本章主要是针对那些不满足于MA∏LAB普通图形特性的读者。如果对 所画的图形已经很满意,那么就跳过当前的讨论。如果以后要定制图形,只要记住这里有可用 的信息 现在,对于那些还在犹豫的用户,我们要强调学习使用句柄图形并不困难。如果只想改变 图形的标题字体,或者改变一个图形窗口的背景颜色,那么,你不必成为一个句柄图形的专家 也可做到。 另一方面,如果想定制图形,并且要打算对图形的每个可能方面进行控制,那么句柄图 会为此提供强有力的工具 前面那些章提供的图形功能被认为是高级的命令和函数,包括plot,mesh,axis及其它 这些函数是建立在底层函数和属性的基础上,总称为句柄图形。 20.2什么是句柄图形对象 句柄图形是基于这样的概念,即一幅图的每一组成部分是一个对象,每一个对象有一系列 句柄和它相关,每一个对象有按需要可以改变的属性 当今计算机行业最流行的术语之一便是对象这个词。面向对象的编程语言,数据库对象, 操作系统和应用程序接口都使用了对象的概念。一个对象可以被粗略地定义为由一组紧密相关、 形成唯一整体的数据结构或函数集合。在 MATLAB中,图形对象是一幅图中很独特的成分, 它可以被单独地操作 由图形命令产生的每一件东西都是图形对象。它们包括图形窗口或仅仅说是图形,还有坐 标轴、线条、曲面、文本和其它。这些对象按父对象和子对象组成层次结构。计算机屏幕是根 对象,并且是所有其它对象的父亲。图形窗口是根对象的子对象;坐标轴和用户界面对象(在
第二十章 句柄图形 ` 什么是句柄图形?句柄图形是对底层图形例程集合的总称,它实际上进行生成图形的工作。 这些细节通常隐藏在图形 M 文件的内部,但如果想使用它们也是可得到的。 MATLAB 用户指南给人的一种印象是,句柄图形非常复杂,只对熟练的高级用户才有用。 而实际上不是这样的。句柄图形可以被任何人用来改变 MATLAB 生成图形的方式,不论是只 想在一幅图里做一点小变动,还是想做影响所有图形输出的全局变动。 句柄图形允许你定制图形的许多特性,而这用高级命令和前几章里描述的函数是无法实现 的。例如,如果想用橘黄色来画一条线,而不是 plot 命令中可用的任何一种颜色,该怎么做呢? 句柄图形就可以提供一种方法。 本章不对句柄图形作详细讨论,因为那样涉及问题太细。这里的目的只是对句柄图形概念 作基本了解,并提供足够多的信息,使得即使是偶尔使用一下 MATLAB 的用户也可以利用句 柄图形。在这个背景下,在本章最后给出了关于句柄图形对象属性和它们的值,它不仅很有用 也很有意义。 20.1 谁需要句柄图形? 开始,我们要强调本章主要是针对那些不满足于 MATLAB 普通图形特性的读者。如果对 所画的图形已经很满意,那么就跳过当前的讨论。如果以后要定制图形,只要记住这里有可用 的信息。 现在,对于那些还在犹豫的用户,我们要强调学习使用句柄图形并不困难。如果只想改变 图形的标题字体,或者改变一个图形窗口的背景颜色,那么,你不必成为一个句柄图形的专家 也可做到。 另一方面,如果想定制图形,并且要打算对图形的每个可能方面进行控制,那么句柄图形 会为此提供强有力的工具。 前面那些章提供的图形功能被认为是高级的命令和函数,包括 plot,mesh,axis 及其它。 这些函数是建立在底层函数和属性的基础上,总称为句柄图形。 20.2 什么是句柄图形对象 句柄图形是基于这样的概念,即一幅图的每一组成部分是一个对象,每一个对象有一系列 句柄和它相关,每一个对象有按需要可以改变的属性。 当今计算机行业最流行的术语之一便是对象这个词。面向对象的编程语言,数据库对象, 操作系统和应用程序接口都使用了对象的概念。一个对象可以被粗略地定义为由一组紧密相关、 形成唯一整体的数据结构或函数集合。在 MATLAB 中,图形对象是一幅图中很独特的成分, 它可以被单独地操作。 由图形命令产生的每一件东西都是图形对象。它们包括图形窗口或仅仅说是图形,还有坐 标轴、线条、曲面、文本和其它。这些对象按父对象和子对象组成层次结构。计算机屏幕是根 对象,并且是所有其它对象的父亲。图形窗口是根对象的子对象;坐标轴和用户界面对象(在
下一章讨论)是图形窗口的子对象;线条、文本、曲面、补片和图象对象是坐标轴对象的子对 象。这种层次关系在图20-1中给出 根对象 (计算机屏幕) 父对象 图形框架窗口对象 图形框架窗口对象 子对象 Imeni对象 Uncontrol对象 坐标系对象 坐标系对象 兄弟对象 影象对象 线条对象 贴片对象 文本对象曲面对象 图20-1对象层次结构 根可包含一个或多个图形窗口,每一个图形窗口可包含一组或多组坐标轴。所有其它的对 象(除了在下一章讨论的 uncontrol和 lAment外)都是坐标轴的子对象,并且在这些坐标轴上显 示。所有创建对象的函数当父对象或对象不存在时,都会创建它们。例如,如果没有图形窗口, plot(rand(size(1:10))函数会用缺省属性创建一个新的图形窗口和一组坐标轴,然后在这组坐 标轴内画线。 20.3句柄对象 假设已打开了三个图形窗口,其中两个有两幅子图。并要改变其中一幅子图坐标轴内一条 线的颜色,如何认定想要改变的那条线?在 MATLAB中,每一个对象都有一个数字来标识 叫做句柄 每次创建一个对象时,就为它建立一个唯一的句柄。计算机屏幕作为根对象常常是0。 Hf fig= = figure命令建立一个新的图形窗口,变量Hffg中返回它的句柄值。图形窗口的句柄为 整数,通常显示在图形窗口标题条中。其它对象句柄是 MATLAB满精度的浮点值 MATLAB可以用来获得图形、坐标轴和其它对象的句柄。例如, > Hf fig=gdf返回当前图 形窗口的句柄值,而》Ha_ax=gca返回当前图形窗口内当前坐标轴的句柄值。这些函数和其它 对象操作的工具在本章以后讨论 为了提高可读性,在本书中包含句柄对象的变量取名以大写的H开头,跟之以一个辨识对
下一章讨论)是图形窗口的子对象;线条、文本、曲面、补片和图象对象是坐标轴对象的子对 象。这种层次关系在图 20-1 中给出。 根对象 (计算机屏幕) 图形框架窗口对象 Uimenu对象 Uicontrol对象 坐标系对象 影象对象 线条对象 贴片对象 文本对象 曲面对象 图形框架窗口对象 坐标系对象 父对象 子对象 兄弟对象 图 20-1 对象层次结构 根可包含一个或多个图形窗口,每一个图形窗口可包含一组或多组坐标轴。所有其它的对 象(除了在下一章讨论的 uicontrol 和 uimenu 外)都是坐标轴的子对象,并且在这些坐标轴上显 示。所有创建对象的函数当父对象或对象不存在时,都会创建它们。例如,如果没有图形窗口, plot(rand(size([1:10])))函数会用缺省属性创建一个新的图形窗口和一组坐标轴,然后在这组坐 标轴内画线。 20.3 句柄对象 假设已打开了三个图形窗口,其中两个有两幅子图。并要改变其中一幅子图坐标轴内一条 线的颜色,如何认定想要改变的那条线?在 MATLAB 中,每一个对象都有一个数字来标识, 叫做句柄。 每次创建一个对象时,就为它建立一个唯一的句柄。计算机屏幕作为根对象常常是 0。» Hf_fig=figure 命令建立一个新的图形窗口,变量 Hf_fig 中返回它的句柄值。图形窗口的句柄为 整数,通常显示在图形窗口标题条中。其它对象句柄是 MATLAB 满精度的浮点值。 MATLAB 可以用来获得图形、坐标轴和其它对象的句柄。例如,» Hf_fig=gcf 返回当前图 形窗口的句柄值,而» Ha_ax=gca 返回当前图形窗口内当前坐标轴的句柄值。这些函数和其它 对象操作的工具在本章以后讨论。 为了提高可读性,在本书中包含句柄对象的变量取名以大写的 H 开头,跟之以一个辨识对
象类型的字母,然后是一个下划线,最后是一个或几个描述符。因此,Hffg是一个图形窗口 的句柄,Haax1是坐标轴对象的句柄,而 Ht title是一个文本对象的句柄。当对象类型不知道 时,用字母x,比如Hx_obj。虽然句柄变量可以取任意名字,遵循这种规则使得能在M文件中 很容易找到句柄变量 所有产生对象的MA1LAB函数都为所建立的每个对象返回一个句柄(或句柄的列向量 这些函数包括plot,mesh,surf及其它。有一些图形由一个以上对象组成。比如,一个网格图 由一个曲面组成,它只有一个句柄;而 waterfall图形由许多线条对象组成,每个线条对象都有 各自的句柄。例如,》 HI fall== waterfall( peaks(20)对线条返回一个包含着20个句柄的列向量。 20.4通用函数get和set 所有对象都有属性来定义它们的特征,正是通过设定这些属性来修正图形显示的方式。尽 管许多属性所有的对象都有,但与每一种对象类型(比如坐标轴,线,曲面)相关的属性列表 都是独一无二的。对象属性可包括诸如对象的位置、颜色、类型、父对象、子对象及其它内容。 每一个不同对象都有和它相关的属性,可以改变这些属性而不影响同类型的其他对象。和每 种对象类型(图形,坐标轴,线,文本,曲面,补片和图象)相关的完整的属性列表在本章的后面 给出 对象属性包括属性名和与它们相联关的值。属性名是字符串,它们通常按混合格式显示 每个词的开头字母大写,比如: LineStvle‘。但是, MATLAB识别一个属性时是不分大小写 的。另外,只要用足够多的字符来唯一地辨识一个属性名即可。例如,坐标轴对象中的位置属 性可以用‘ Position',‘ position‘,甚至是‘pos‘来调用。 当建立一个对象时,它用一组缺省属性值,该值可以用两种方法来改变。可以用{属性名 属性值}对来建立对象生成函数;或者在对象建立后改变属性。前一种方法的例子是: >)Hf 1=figure( color,, white) 它用缺省的属性值建立一个新的图形窗口,只是背景颜色被设为白色而不是缺省的黑色。 为了获得和改变句柄图形对象的属性只需要两个函数。函数get返回某些对象属性的当前 值。使用函数get的最简单语法是get( handle,, Property Name')。例如: >)p=get(Hf 1, position) 返回具有句柄Hf1图形窗口的位置向量 ))c=get(HI a, color) 返回具有句柄Hla对象的颜色。 函数set改变句柄图形对象属性,使用语法set( handle, PropertyName', value)。例如: >)set(Hf 1, Position, p vect)
象类型的字母,然后是一个下划线,最后是一个或几个描述符。因此,Hf_fig 是一个图形窗口 的句柄,Ha_ax1 是坐标轴对象的句柄,而 Ht_title 是一个文本对象的句柄。当对象类型不知道 时,用字母 x,比如 Hx_obj。虽然句柄变量可以取任意名字,遵循这种规则使得能在 M 文件中 很容易找到句柄变量。 所有产生对象的 MATLAB 函数都为所建立的每个对象返回一个句柄(或句柄的列向量)。 这些函数包括 plot,mesh,surf 及其它。有一些图形由一个以上对象组成。比如,一个网格图 由一个曲面组成,它只有一个句柄;而 waterfall 图形由许多线条对象组成,每个线条对象都有 各自的句柄。例如,» Hl_wfall=waterfall(peaks(20)) 对线条返回一个包含着 20 个句柄的列向量。 20.4 通用函数 get 和 set 所有对象都有属性来定义它们的特征,正是通过设定这些属性来修正图形显示的方式。尽 管许多属性所有的对象都有,但与每一种对象类型(比如坐标轴,线,曲面)相关的属性列表 都是独一无二的。对象属性可包括诸如对象的位置、颜色、类型、父对象、子对象及其它内容。 每一个不同对象都有和它相关的属性,可以改变这些属性而不影响同类型的其他对象。和每一 种对象类型(图形,坐标轴,线,文本,曲面,补片和图象)相关的完整的属性列表在本章的后面 给出。 对象属性包括属性名和与它们相联关的值。属性名是字符串,它们通常按混合格式显示, 每个词的开头字母大写,比如:’ LineStyle ‘ 。但是,MATLAB 识别一个属性时是不分大小写 的。另外,只要用足够多的字符来唯一地辨识一个属性名即可。例如,坐标轴对象中的位置属 性可以用 ‘ Position ‘ , ‘ position ‘ ,甚至是 ‘ pos ‘ 来调用。 当建立一个对象时,它用一组缺省属性值,该值可以用两种方法来改变。可以用{属性名, 属性值}对来建立对象生成函数;或者在对象建立后改变属性。前一种方法的例子是: » Hf_1=figure( ‘color’, ‘white’ ) 它用缺省的属性值建立一个新的图形窗口,只是背景颜色被设为白色而不是缺省的黑色。 为了获得和改变句柄图形对象的属性只需要两个函数。函数 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)
将具有句柄Hf1的图形位置设为向量 p vect所指定的值。同样 >)set(HI a, color, 'r') 将具有句柄Hla的对象的颜色设置成红色 一般情况下,函数set可以有任意数目的( PropertyName', Property value)对。比如: >)set(HI a, 'Color', I', ' Linewidth, 2, LinStyle', ' -- 将具有句柄Ha的线条变成红色,线宽为2点,线型为破折号 除了这些主要功能,函数set和函数get还能提供帮助。例如yse( handle, Property Name) 返回一个可赋给由 handle所描述对象的属性值列表。例如: >)set(Hf 1, Units') linches normalized points(pixels)] 表明由Hr1所引用的图形的' Unites’属性是五个可允许的字符串,而其中 pixels是缺省值 如果指定一个没有固定值的属性,那么, MATLAB就会通知如下: ))set(Hf 1, Position) a figure's 'Position property does not have a fixed set of property value 除了set命令,句柄图形对象创建函数(例如 figure,axis,line等等)接受多个属性名和 属性值对。例如 D figure( "Color,, "blue, Number Title, 'off,, Name, 'My Figure) 创建一个图形窗口,背景为兰色,标有‘ My Figure’而不是缺省标题‘ Figure No.1 为了形象说明上述概念,考虑下面的例子 )Hf fig=figure create a figure having an interger handle Hf fig= >)HI line-line create a line having a floating-pointer handle H 59.0002 ues EraseMode: [normal; I background I xor I none Linestyle[ -; Linewidth
将具有句柄 Hf_1 的图形位置设为向量 p_vect 所指定的值。同样 » set(Hl_a, ‘color’ , ‘r’ ) 将具有句柄 Hl_a 的对象的颜色设置成红色。 一般情况下,函数 set 可以有任意数目的( ‘PropertyName’ ,PropertyValue)对。比如: » set(Hl_a, ‘Color’ , ‘r’ , ‘Linewidth’ ,2, ‘LinStyle’ , ‘--’ ) 将具有句柄 Hl_a 的线条变成红色,线宽为 2 点,线型为破折号。 除了这些主要功能,函数 set 和函数 get 还能提供帮助。例如» set(handle, ‘PropertyName’ ) 返回一个可赋给由 handle 所描述对象的属性值列表。例如: » set(Hf_1, ‘Units’ ) [inches|centimeters|normalized|points|{pixels}] 表明由 Hf_1 所引用的图形的 ‘Unites’ 属性是五个可允许的字符串,而其中 ‘pixels’ 是缺省值。 如果指定一个没有固定值的属性,那么,MATLAB 就会通知如下: » set(Hf_1, ‘Position’ ) A figure’s ‘Position’ property does not have a fixed set of property values。 除了 set 命令,句柄图形对象创建函数(例如 figure,axis,line 等等)接受多个属性名和 属性值对。例如: » figure( ‘Color’ , ‘blue’ , ‘NumberTitle’ , ‘off’ , ‘Name’ , ‘My Figure’ ) 创建一个图形窗口,背景为兰色,标有‘My Figure’而不是缺省标题‘Figure No. 1’。 为了形象说明上述概念,考虑下面的例子: » Hf_fig =figure % create a figure having an interger handle Hf_fig= 1 » Hl_line=line % create a line having a floating-pointer handle Hl_line = 59.0002 » set(Hl_line); % list settable properties and potential values Color EraseMode: [ {normal} | background | xor | none ] LineStyle: [ {-} | -- | : | -. | + | o | * | . | x ] LineWidth
Xdata Ydata Button DownFcn [on; loff Interruptible: [(no l yes I Parent >get(HI line); list properties and current property values Color=[11 1] Erase Mode normal Line width=[0.5] MarkerSize=6 Xdata=[0 Ydata=[0 1 Zdata=[ Button Down Fcn= Children= Clipping=oI Parent=[58.0002] Iv UserData=[ Visible=on 在上例中,所创建的线条中的" Parent'属性就是包含线条的坐标轴的句柄。而且所显示的 图形列表被分为两组。在空行上的第一组,列出了该对象的独有属性,而空行下的第二组列出 所有的对象共有的属性。注意到函数set和函数get返回不同的属性列表。函数set只列出可以 用set命令改变的属性,而get命令列出所有对象的属性。在上面的例子中,函数get列出了 hildren'和"Type'属性,而se命令却没有。这一类属性只可读,但不能被改变,它们叫做 只读属性。 与每一个对象有关的属性数目是固定的,但不同的对象类型有不同数目的属性。象上面所 显示的,一个线条对象列出了16个属性,而一个坐标轴对象列出了64个属性。显然,透彻地 说明和描述所有对象类型的全部属性超出本书的范围。但是,其中的很多属性本书以后要详细 讨论,并且列出全部属性
MarkerSize Xdata Ydata Zdata ButtonDownFcn Clipping: [ {on} | off ] Interruptible: [ {no} | yes ] Parent UserData Visible: [ {on} | off ] » get(Hl_line); % list properties and current property values Color = [1 1 1] EraseMode = normal LineStyle = - LineWidth = [0.5] MarkerSize = [6] Xdata = [0 1] Ydata = [0 1] Zdata = [ ] ButtonDownFcn = Children = [ ] Clipping = on Interruptible = no Parent = [58.0002] Type = line UserData = [ ] Visible = on 在上例中,所创建的线条中的 ‘Parent’ 属性就是包含线条的坐标轴的句柄。而且所显示的 图形列表被分为两组。在空行上的第一组,列出了该对象的独有属性,而空行下的第二组列出 所有的对象共有的属性。注意到函数 set 和函数 get 返回不同的属性列表。函数 set 只列出可以 用 set 命令改变的属性,而 get 命令列出所有对象的属性。在上面的例子中,函数 get 列出了 ‘Children’ 和 ‘Type’ 属性,而 set 命令却没有。这一类属性只可读,但不能被改变,它们叫做 只读属性。 与每一个对象有关的属性数目是固定的,但不同的对象类型有不同数目的属性。象上面所 显示的,一个线条对象列出了 16 个属性,而一个坐标轴对象列出了 64 个属性。显然,透彻地 说明和描述所有对象类型的全部属性超出本书的范围。但是,其中的很多属性本书以后要详细 讨论,并且列出全部属性
作为一个使用图象句柄的例子,可以考虑前面提出的问题。它要用非标准颜色画一条线 在这里,线的颜色用RGB值1.50来指定,它是适中的橘黄色 -2*pi I >)y=sin(x); find the sine of x ))HI sin=plot(x, y) plot sine and save line handle HI 59.0002 >)set(H sin, Color, [1.50), Line Width, 3)% Change the color and width 现在加一个浅蓝色的 cosine曲线: >)Z=cos(x); find the cosine ofx >)hold on keep the sine curve plot(x, z); plot the cosine and save the hand >)set(HI cos, Color',[75.75 1 color it light blue hold off 也可以用较少的步骤来实现同样的功能 >HI lines-plot(x, y, x, z); plot both curves and save both handles >)set(HI line( 1), Color, [1.501, Linewidth, 3) >)set(HI line( 2), Color, [75. ID) 如何加上一个标题并且使字体比正常大一些呢 >)title( Handle Graphics Example) add a title >Ht text=get(gca, Title)% get a handle to the title >)set(Ht text, FontSize, 16) customize the font size 最后一个例子说明了关于坐标轴对象令人感兴趣的性质。每一个对象都含有 Parent属性 和' Children’属性,该属性包含属于派生对象的句柄。画在一组坐标轴上的线,具有当作 Parent'属性值的坐标轴对象的句柄,而‘ Children‘属性值是一个空距阵。同时,这个坐标轴 对象具有当作‘ Parent‘属性值的图形句柄,而‘ Children‘属性值是线条对象的句柄。标题字 符串和坐标轴的标志不包含在坐标轴的‘ Children‘属性值里,而是保存在‘ Title‘、‘ Xlabel Ylabel‘和‘ Zlabel‘的属性内。创建坐标轴对象时,这些文本对象就建立。 title命令设 置当前坐标轴内标题文本对象的 String属性。最终,标准 MATLAB的函数tte, xlabel, ylabel 和 zlabel不返回句柄,而只接受属性和数值参量。例如下面的命令给当前图加一个24点的绿色 标题 >)title( This is a title., Fontsize, 24, Color', green)
作为一个使用图象句柄的例子,可以考虑前面提出的问题。它要用非标准颜色画一条线。 在这里,线的颜色用 RGB 值[1 .5 0]来指定,它是适中的橘黄色。 » x=-2*pi:pi/40:2*pi; % create data » y=sin(x); % find the sine of x » Hl_sin=plot(x,y) % plot sine and save line handle Hl_sin= 59.0002 » set(Hl_sin, ‘Color’ ,[1 .5 0], ‘LineWidth’ ,3) % Change the color and width 现在加一个浅蓝色的 cosine 曲线: » z=cos(x); % find the cosine of x » hold on % keep the sine curve » Hl_cos=plot(x,z); % plot the cosine and save the handle » set(Hl_cos, ‘Color’ ,[.75 .75 1]) % color it light blue » hold off 也可以用较少的步骤来实现同样的功能: » Hl_lines=plot(x,y,x,z); % plot both curves and save both handles » set(Hl_line(1), ‘Color’ ,[1 .5 0], ‘LineWidth’ ,3) » set(Hl_line(2), ‘Color’ ,[.75 .75 1]) 如何加上一个标题并且使字体比正常大一些呢? » title( ‘Handle Graphics Example’ ) % add a title » Ht_text=get(gca, ‘Title’ ) % get a handle to the title » set(Ht_text, ‘FontSize’ ,16) % customize the font size 最后一个例子说明了关于坐标轴对象令人感兴趣的性质。每一个对象都含有 ‘Parent’ 属性 和 ‘Children’ 属性,该属性包含属于派生对象的句柄。画在一组坐标轴上的线,具有当作 ‘Parent’ 属性值的坐标轴对象的句柄,而 ‘ Children ‘ 属性值是一个空距阵。同时,这个坐标轴 对象具有当作 ‘ Parent ‘ 属性值的图形句柄,而 ‘ Children ‘ 属性值是线条对象的句柄。标题字 符串和坐标轴的标志不包含在坐标轴的 ‘ Children ‘ 属性值里,而是保存在 ‘ Title ‘ 、 ‘ Xlabel ‘ 、 ‘ Ylabel ‘ 和 ‘ Zlabel ‘ 的属性内。创建坐标轴对象时,这些文本对象就建立。title 命令设 置当前坐标轴内标题文本对象的 ‘String’ 属性。最终,标准 MATLAB 的函数 title,xlabel,ylabel 和 zlabel 不返回句柄,而只接受属性和数值参量。例如下面的命令给当前图加一个 24 点的绿色 标题: » title( ‘This is a title.’ , ‘Fontsize’ ,24, ‘Color’ , ‘green’ )
除了函数set和get, MATLAB还提供了另外两个函数来操作对象和它们的属性。任意对 象和它们的子对象可以用) delete( handle)来删除。同样 o) reset( handle)将与句柄有关的全部 对象属性(除了‘ Position’属性)重新设置为该对象类型的缺省值 20.5查找对象 正如你所见,句柄图形提供了对图形对象的访问途径,并且允许用函数get和set定制图形。 但是,如果忘记保存句柄或图中对象的句柄将会怎样呢?或者,也许变量被覆盖又如何呢?如 果不知道它们的句柄,怎么改变对象的属性呢?为解决这个问题, MATLAB提供了查找对象句 柄的工具 gf和gca这两种工具前面已经介绍过了 >)Hf fig=ge 返回当前图形的句柄,而 )Ha axgca 返回当前图形的当前坐标轴的句柄。 除了这些,还有一个获取当前对象的gco ) Hx obj=g 返回当前图形的当前对象的句柄。或者用另一种方法: >)Hx obj=gco(Hf fig) 返回与句柄Hffg有关的图形中当前对象的句柄 当前对象的定义为用鼠标刚刚点过的对象。这种对象可以是除根对象(计算机屏幕)之外 的任何图形对象。但是,如果鼠标指针处在一个图形中而鼠标按钮未点,gco返回一个空距阵。 为了让当前对象存在,我们必须选择一些东西。 旦获得了一个对象的句柄,它的对象类型可以通过查询对象的Type'属性来获得。该属 性是一个字符串对象名,比如 figure',"axes或text'。例如: >)x type=get(Hx obj, Type) MATLAB中的函数gef,gca和gco是很好的例子,它们说明如何利用句柄图形来获得有关 对象的信息。函数gcf获得根对象的 Current Figure'的属性值,即是当前图形的句柄。gcfM 文件包含
除了函数 set 和 get,MATLAB 还提供了另外两个函数来操作对象和它们的属性。任意对 象和它们的子对象可以用 » delete(handle) 来删除。同样 »reset(handle) 将与句柄有关的全部 对象属性(除了 ‘Position’ 属性)重新设置为该对象类型的缺省值。 20.5 查找对象 正如你所见,句柄图形提供了对图形对象的访问途径,并且允许用函数 get 和 set 定制图形。 但是,如果忘记保存句柄或图中对象的句柄将会怎样呢?或者,也许变量被覆盖又如何呢?如 果不知道它们的句柄,怎么改变对象的属性呢?为解决这个问题,MATLAB 提供了查找对象句 柄的工具。 gcf 和 gca 这两种工具前面已经介绍过了。 » Hf_fig=gcf 返回当前图形的句柄,而 » Ha_ax=gca 返回当前图形的当前坐标轴的句柄。 除了这些,还有一个获取当前对象的 gco。 » Hx_obj=gco 返回当前图形的当前对象的句柄。或者用另一种方法: » Hx_obj=gco(Hf_fig) 返回与句柄 Hf_fig 有关的图形中当前对象的句柄。 当前对象的定义为用鼠标刚刚点过的对象。这种对象可以是除根对象(计算机屏幕)之外 的任何图形对象。但是,如果鼠标指针处在一个图形中而鼠标按钮未点,gco 返回一个空距阵。 为了让当前对象存在,我们必须选择一些东西。 一旦获得了一个对象的句柄,它的对象类型可以通过查询对象的 ‘Type’ 属性来获得。该属 性是一个字符串对象名,比如 ‘figure’ ,’axes’ 或 ‘text’ 。例如: » x_type=get(Hx_obj, ‘Type’ ) MATLAB 中的函数 gcf,gca 和 gco 是很好的例子,它们说明如何利用句柄图形来获得有关 对象的信息。函数 gcf 获得根对象的 ‘CurrentFigure’ 的属性值,即是当前图形的句柄。gcf M 文件包含:
GCF Get current figure handle H=GCF returns the handle to the current figure. The current fugure is the figure( graphics window )that graphics commands like PLOT,TITLE, SURF, etc. draw to if issued % Use the ands Figure to change the current figure to a diffent figure, or to creat % See also FIgure cloSe clf gca. Copyright (c) 1984-94 by The Math Works, Inc h=get(O, ' CurrentFigure') 类似的,函数gca返回当前图形的 CurrentAxes属性值,它的M文件描述如下 gCa Get current axis handle H=GCA returns the handle to the current axis. The current axis is the axis that graphics command like Plot. TITLE SURF etc. draw to if issued %o Use the commands aXes or SUBPlOt to change the current axis to a different axis or to see also AXES, SUBPLOT, DELETE, CLA, HOLD, GCF Copyright (c) 1984-94 by The Math Works, Inc h=get( get(O, CurrentFigure'), CurrentAxes') 函数go也相同,只是它在试图获得当前对象之前先检查图形是否存在。注意函数 gca能促使建立相关的对象,如果它们不存在的话。如下所示的函数gco,它先检查子对象 ( Children')是否存在,如果不存在,就不创建图形对象 %GCo Handle of current object OBJECT=GCO returns the current object in the current figure % OBJECT=GCO(FIGURE) returns the current object in figure FIGURE % The current object for a given figure is the last object clicked on with mouse %Copyright (c) 1984-94 by The Math Works, Inc if isempty (get(O, "Children))
function h=gcf() % GCF Get current figure handle. % H=GCF returns the handle to the current figure.The current fugure is the figure(graphics window)that graphics commands like PLOT,TITLE,SURF,etc.draw to if issued. % % Use the commands FIGURE to change the current figure to a diffent figure,or to create new % ones. % % See also FIGURE,CLOSE,CLF,GCA. % Copyright (c) 1984-94 by The MathWorks,Inc. h=get(0, ‘CurrentFigure’ ); 类似的,函数 gca 返回当前图形的 ‘CurrentAxes’ 属性值,它的 M 文件描述如下。 function h=gca() % GCA Get current axis handle. % H=GCA returns the handle to the current axis.The current axis is the axis that graphics % command like PLOT,TITLE,SURF,etc.draw to if issued. % % Use the commands AXES or SUBPLOT to change the current axis to a different axis,or to % create new ones. % see also AXES,SUBPLOT,DELETE,CLA,HOLD,GCF. % Copyright (c) 1984-94 by The MathWorks,Inc. h=get(get(0, ‘CurrentFigure’ ), ‘CurrentAxes’ ); 函数 gco 也相同,只是它在试图获得当前对象之前先检查图形是否存在。注意函数 gcf 和 gca 能促使建立相关的对象,如果它们不存在的话。如下所示的函数 gco,它先检查子对象 ( ‘Children’ )是否存在,如果不存在,就不创建图形对象。 function object=gco(figure) %GCO Handle of current object. % OBJECT=GCO returns the current object in the current figure. % % OBJECT=GCO(FIGURE) returns the current object in figure FIGURE. % % The current object for a given figure is the last object clicked on with mouse. %Copyright (c) 1984-94 by The MathWorks,Inc. if isempty(get(0, ‘Children’ ))
if (nargin==0) figure=get(O, 'CurrentFigure') object=get(figure, Current Object); 当需要一些除了 Current Figure'、 urrentAxes'和 Currentobject'之外的某些东西 时,可以用函数get来获得一个对象的子对象的句柄向量。例如: >)Hx kids==get(gcf, 'Children) 返回一个向量,它包含当前图形子对象的句柄 可以用获得子对象' Children’句柄的技术彻底搜索句柄图形的层次结构中来找到所要的 对象。例如,在画出一些数据后,寻找绿色线条句柄的问题。 >)X-pi: pi/20 pi; create some data >y=sin(x): Z=cos(x) > plot(x, y, r, x, z, g); plot two lines in red and green >)HI lines-get( gca, Children); get the line handles >for k-l: size(Hl lines) find the green line >if get(HI lines(k), Color)==[0] HI green=HI lines(k) HI green= 58.0001 尽管这种技术有效,但是如果有很多对象存在就变得复杂。该技术也丢失了标题和坐标轴 标志中的文本对象,除非能逐个检测这些对象 当有多个图形,每个图形上又有多个坐标轴时,考虑查找所有绿色线条的句柄的问题。 >) Hf all==get(O, 'Children); get all figure handles > for kl: length(Hf all) > Ha all= Ha all; get(Hf all(k), ' Children); get all axes handles >)for k=1: length(Ha all) ) Hx all=[Hx all; get(Ha all(k), Children); get axes child handles
object=[ ]; return; end; if (nargin==0) figure=get(0, ‘CurrentFigure’ ); end object=get(figure, ‘CurrentObject’ ); 当需要一些除了 ‘CurrentFigure’ 、 ‘CurrentAxes’ 和 ‘CurrentObject’ 之外的某些东西 时,可以用函数 get 来获得一个对象的子对象的句柄向量。例如: » Hx_kids=get(gcf, ‘Children’ ) 返回一个向量,它包含当前图形子对象的句柄。 可以用获得子对象 ‘Children’ 句柄的技术彻底搜索句柄图形的层次结构中来找到所要的 对象。例如,在画出一些数据后,寻找绿色线条句柄的问题。 » x=-pi:pi/20:pi; % create some data » y=sin(x);z=cos(x); » plot(x,y, ‘r’ ,x,z, ‘g’ ); % plot two lines in red and green » Hl_lines=get(gca, ‘Children’ ); % get the line handles » for k=1:size(Hl_lines) % find the green line »if get(Hl_lines(k), ‘Color’ )==[0 1 0] » Hl_green=Hl_lines(k) » end » end Hl_green= 58.0001 尽管这种技术有效,但是如果有很多对象存在就变得复杂。该技术也丢失了标题和坐标轴 标志中的文本对象,除非能逐个检测这些对象。 当有多个图形,每个图形上又有多个坐标轴时,考虑查找所有绿色线条的句柄的问题。 » Hf_all=get(0, ‘Children’ ); % get all figure handles » for k=1:length(Hf_all) » Ha_all=[Ha_all;get(Hf_all(k), ‘Children’ )]; % get all axes handles » end » for k=1:length(Ha_all) » Hx_all=[Hx_all;get(Ha_all(k), ‘Children’ )]; % get axes child handles
>) for k=1: length(Hx all) >) if get( Hx all(k), Type )=="line >) HI all=(HI all; Hx all(k)]; get line handles only >) for k=l: length(HI all >) if get(HI all(k), Color)=[0] > HI green=[HI green; HI all(k); find green ones 为了简化查找对象句柄的过程, MATLAB4.2版本和以后的版本提供了内置函数 findobj 该函数返回有指定属性值的所有对象句柄。它的在线帮助如下 help findobj FINDOBJ Find objects with specified property values H=FINDOBJ( PIName', PlValue,.)returns the handle of the objects at the root level and below whose property values match those as param-value pairs to the FINDOBJ H=FINDOBJ(Object Handles, PIName', PIValue,)restricts the search to the objects listed in ObjectHandle and their descendents H=FINDOBJ(ObjectHandles, 'flat', 'PIName', PlValue,) restrics the search only to the objects listed in ObjectHandles. Their descendents are not searched H=FINDOBJ returns the handles of the root object and all its descendents H=FINDOBJ(ObjectHandles) returns the handles listed in Objecthandles, and the handles of all their descendents See also SEt GeT GCFgCa 帮助信息: FINDOBJ寻找具有指定的属性值的对象 H= FINDOBJ( PINane', PI Value,…)返回根部和根部以下那些属性值与 FINDOBJ参数 对相匹配的对象句柄 H= FINDOBJ(ObjectHandles, PINane', LvAlue,…)搜索限定在 ObjectHandles中列
» end » for k=1:length(Hx_all) » if get(Hx_all(k), ‘Type’ )== ‘line’ » Hl_all=[Hl_all;Hx_all(k)]; % get line handles only » end » end » for k=1:length(Hl_all) » if get(Hl_all(k), ‘Color’ )==[0 1 0] » Hl_green=[Hl_green;Hl_all(k)]; % find green ones » end » end 为了简化查找对象句柄的过程,MATLAB 4.2 版本和以后的版本提供了内置函数 findobj。 该函数返回有指定属性值的所有对象句柄。它的在线帮助如下: » help findobj FINDOBJ Find objects with specified property values. H=FINDOBJ( ‘PlName’ ,PlValue,...) returns the handle of the objects at the root level and below whose property values match those as param-value pairs to the FINDOBJ command. H=FINDOBJ(ObjectHandles, ‘PlName’ ,PlValue,...) restricts the search to the objects listed in ObjectHandle and their descendents. H=FINDOBJ(ObjectHandles, ‘flat’ , ‘PlName’ ,PlValue,...) restrics the search only to the objects listed in ObjectHandles.Their descendents are not searched. H=FINDOBJ returns the handles of the root object and all its descendents. H=FINDOBJ(ObjectHandles) returns the handles listed in Objecthandles ,and the handles of all their descendents. See also SET,GET,GCF,GCA. 帮助信息: FINDOBJ 寻找具有指定的属性值的对象 H=FINDOBJ( ‘P1Name’ ,P1Value,…)返回根部和根部以下那些属性值与 FINDOBJ 参数 对相匹配的对象句柄。 H=FINDOBJ(ObjectHandles, ‘P1Name’ ,P1Value,…)搜索限定在 ObjectHandles 中列