Matlab 版 (精华区)
发信人: bage (最近比较烦), 信区: Matlab
标 题: 精通Matlab(十二)
发信站: 哈工大紫丁香 (Sun Feb 4 14:04:10 2001), 转信
发信人: Security (淼水), 信区: MathTools
发信站: BBS 水木清华站 (Tue Jun 1 22:39:46 1999)
第二十章 句柄图形
` 什么是句柄图形?句柄图形是对底层图形例程集合的总称,它实际上进行生成图形的工作。这些细节通常隐藏在图形M文件的内部,但如果想使用它们也是可得到的。
MATLAB用户指南给人的一种印象是,句柄图形非常复杂,只对熟练的高级用户才有用。而实际上不是这样的。句柄图形可以被任何人用来改变MATLAB生成图形的方式,不论是只想在一幅图里做一点小变动,还是想做影响所有图形输出的全局变动。
句柄图形允许你定制图形的许多特性,而这用高级命令和前几章里描述的函数是无法实现的。例如,如果想用橘黄色来画一条线,而不是plot命令中可用的任何一种颜色,该怎么做呢?句柄图形就可以提供一种方法。
本章不对句柄图形作详细讨论,因为那样涉及问题太细。这里的目的只是对句柄图形概念作基本了解,并提供足够多的信息,使得即使是偶尔使用一下MATLAB的用户也可以利用句柄图形。在这个背景下,在本章最后给出了关于句柄图形对象属性和它们的值,它不仅很有用也很有意义。
20.1 谁需要句柄图形?
开始,我们要强调本章主要是针对那些不满足于MATLAB普通图形特性的读者。如果对所画的图形已经很满意,那么就跳过当前的讨论。如果以后要定制图形,只要记住这里有可用的信息。
现在,对于那些还在犹豫的用户,我们要强调学习使用句柄图形并不困难。如果只想改变图形的标题字体,或者改变一个图形窗口的背景颜色,那么,你不必成为一个句柄图形的专家也可做到。
另一方面,如果想定制图形,并且要打算对图形的每个可能方面进行控制,那么句柄图形会为此提供强有力的工具。
前面那些章提供的图形功能被认为是高级的命令和函数,包括plot,mesh,axis及其它。这些函数是建立在底层函数和属性的基础上,总称为句柄图形。
20.2 什么是句柄图形对象
句柄图形是基于这样的概念,即一幅图的每一组成部分是一个对象,每一个对象有一系列句柄和它相关,每一个对象有按需要可以改变的属性。
当今计算机行业最流行的术语之一便是对象这个词。面向对象的编程语言,数据库对象,操作系统和应用程序接口都使用了对象的概念。一个对象可以被粗略地定义为由一组紧密相关、形成唯一整体的数据结构或函数集合。在MATLAB中,图形对象是一幅图中很独特的成分,它可以被单独地
操作。
由图形命令产生的每一件东西都是图形对象。它们包括图形窗口或仅仅说是图形,还有坐标轴、线条、曲面、文本和其它。这些对象按父对象和子对象组成层次结构。计算机屏幕是根对象,并且是所有其它对象的父亲。图形窗口是根对象的子对象;坐标轴和用户界面对象(在下一章讨论)
是图形窗口的子对象;线条、文本、曲面、补片和图象对象是坐标轴对象的子对象。这种层次关系在图20-1中给出。
图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开头,跟之以一个辨识对象类型的字母,然后是一个下划线,最后是一个或几个描述符。因此,Hf_fig是一个图形窗口的句柄,Ha_ax1是坐标轴对象的句柄,而Ht_title是一个文本对象的句柄。当对象类型不知道时,用字母x,
比如Hx_obj。虽然句柄变量可以取任意名字,遵循这种规则使得能在M文件中很容易找到句柄变量。
所有产生对象的MATLAB函数都为所建立的每个对象返回一个句柄(或句柄的列向量)。这些函数包括plot,mesh,surf及其它。有一些图形由一个以上对象组成。比如,一个网格图由一个曲面组成,它只有一个句柄;而waterfall图形由许多线条对象组成,每个线条对象都有各自的句柄。
例如,? Hl_wfall=waterfall(peaks(20)) 对线条返回一个包含着2得了一个对象的句柄,它的对象类型可以通过查询对象的 'Type' 属性来获得。该属性是一个字符串对象名,比如 'figure' ,'axes' 或 'text' 。例如:
? x_type=get(Hx_obj, 'Type' )
MATLAB中的函数gcf,gca和gco是很好的例子,它们说明如何利用句柄图形来获得有关对象的信息。函数gcf获得根对象的 'CurrentFigure' 的属性值,即是当前图形的句柄。gcf M文件包含:
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' ))
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
尽管这种技术有效,但是如果有很多对象存在就变得复杂。该技术也丢失了标题和向
ORIENT LANDSCAPE使得以后从该图形窗口的打印操作时,图形在打印纸上的设置为景象 方向的全幅方式。
ORIENT PORTRAIT使得以后从该图形窗口的打印操作时,图形在打印纸的中间占据一个肖 像方向4/3长宽比的矩形。
ORIENT TALL使得以后从该图形窗口的打印操作时,图形在在打印纸上的设置为肖像方向 的全幅方式。
ORIENT不加参数时,返回一个包含当前纸张设置的字符串,值为LANDSCAPE, PORTRAIT或TALL。
ORIENT 是一个M文件,它设置当前图形窗口对象中的PaperOrientation和PaperPosition属性。
参阅PRINT
影响打印输出的图形属性在表20.1中:
表20.1
图形的打印纸属性
PaperUnits [{inches}|centimeters|normalized|points]
PaperOrientati-on [{portrait}|landscape]
PaperPosition 位置向量,形式为[left,bottom,width,height]。[left,bottom]代表了从打印页左下角的偏移,[width,height]是图形尺寸
PaperSize 包含纸张尺寸([8.5 11])的两元素向量
PaperType [{usletter}|uslegal1|a3|a4letter|a5|b4|tabloid]
'PaperPosition' 和 'PaperSize' 属性的返回值的单位由 'PaperUnits' 属性指定。与改变图形对象 'Position' 属性以改变屏幕上图形窗口的大小和位置一样,改变 'PaperPosition' 属性可以改变图形在打印页上的大小和位置。
考虑下面的例子,说明如何使用纸张属性。
? set(gcf, 'PaperType' , 'a4letter' )
将当前图形打印所用纸张设为 ' a4letter ' 。
? set(gcf, 'PaperOrientation' , 'landscape' )
将当前图形窗口的图的方向设为 ' landscape ' 。
象其它图形属性一样,上面的纸张属性用于单个图形。关于修改所有图形属性在下节"缺省属性"中进行讨论。
20.9 缺省属性
MATLAB在建立对象时把缺省属性赋给各对象。如果想不采用这些缺省值,那么,必须使用句柄图形工具对它们进行设置。当每次都要改变同一属性时,MATLAB允许设置用户自己的缺省属性。MATLAB让用户改变对象层次结构中任意一点上的单个对象或对象类型的缺省属性。
可以使用一个特殊性质名字符串来设置缺省值,该字符串以 'Default' 开头,跟之以对象类型和属性名。使用set命令中的句柄,确定对象父-子等级图中的点,在该点使用缺省值。例如:
? set(0, 'DefaultFigureColor' ,[.5 .5 .5])
将所有的新图形对象设为适中的灰色,而不是MATLAB缺省的黑色。该属性值应用于根对象(它的句柄总是0),所以所有新图形会有一个灰色的背景。
下面是另外一些可改变缺省值的例子。
? set(0, 'DefaultAxesFontSize' ,14) % larger axes fonts - all figures
? set(gcf, 'DefaultAxesLineWidth' ,2) % thick axes lines - this figure
? set(gcf, 'DefaultAxesColor' , 'y' ) % yellow X-axis lines and labels
? set(gcf, 'DefaultAxesGrid' , 'on' ) % Y axis grid lines - this figure
? set(0, 'DefaultAxesBox' , 'on' ) % enclose axes - all figures
? set(gcf, 'DefaultLineLineStyle' , ':' ) % dotted linestyle - these axes
当应用已存在对象工作时,使用后把它们恢复到初始的状态是一个很好的想法。如果想在一段例程中改变对象的缺省属性,那么保存原来的设置并在激活例程时将它们恢复。例如,考虑下面一段函数:
oldunits=get(0, 'DefaultFigureUnits' );
set(0, 'DefaultFigureUnits' , 'normalized' );
<MATLAB statements>
set(0, 'DefaultFigureUnits',oldunits);
return
如果在所有的时刻用自己的缺省值来设定MATLAB,那么只要在startup.m文件里包括进所需的set命令就可以了。例如,如果在所有的轴上想要缺省的网格和坐标轴框,并且经常在A4纸上打印,就把下面这些行加到start.m文件中即可。
set(0, 'DefaultAxesXGrid' , 'on' )
set(0, 'DefaultAxesYGrid' , 'on' )
set(0, 'DefaultAxesZGrid' , 'on' )
set(0, 'DefaultAxesBox' , 'on' )
set(0, 'DefultFigurePaperType' , 'a4paper' )
关于脚本M文件start.m的更详细的信息,可参阅第二章。
有三个特殊的属性值字符串 'remove' 、 'factory' 和 'default' ,它们逆转、取消或获得用户自定义缺省属性。如果改变了一个缺省属性,可以使用 'remove' 逆转这种变化,把它重新设为初始的缺省值。使用 'remove' 说明如下:
? set(0, 'DefaultFigureColor' ,[.5 .5 .5]) % set a new default
? set(0, 'DefaultFigureColor' , 'remove' ) % return to MATLAB defaults
对一特殊对象,为了暂时取消缺省值并用最初的MATLAB缺省值,就用特殊的属性值 'factory' 。例如:
? set(0, 'DefaultFigureColor' ,[.5 .5 .5]) % set a new user default
? figure( 'Color' , 'factory' ) % create a new figure using the MATLAB default
第三个特殊的属性值字符串是 'default'
。这个属性值迫使MATLAB搜索对象层次结构,直到查到所需属性的一个缺省值。如果找到,它就使用该缺省值。如果查到根对象,没有找到用户定义的缺省值,MATLAB就使用factory缺省值。在用不同的属性值创建一个对象后,要把对象缺省设成缺省属性值时,这个概念是很有用的。为了
弄清 'default' 的使用,考虑下面的例子。
? set(0, 'DefaultFigureColor' , 'r' ) % set the default at the root level
? set(gcf, 'DefaultFigureColor' , 'g' ) % current figure level default
? set(gca, 'DefaultFigureColor' , 'b' ) % current axes level default
? Hl_rand=plot(rand(size([1:10]))) % plot a yellow line
? set(H1_rand, 'Color' , 'default' ) % the line become blue
? set(gca, 'DefaultFigureColor' , 'remove' ) % the axes level default is removed
? set(Hl_rand, 'Color' , 'default' ) % the line become green
? close(gcf) % close the window
? Hl_rand=plot(rand(size([1:10]))) % plot a yellow line in a new window
1 ? set(Hl_rand, 'Color' , 'default' ) % the line becomes red
注意到plot命令并不对线的颜色设为线条对象的缺省值。如颜色参量未指定,plot命令使用坐标轴 'ColorOrder' 属性来指定它所产生的每条线的颜色。
20.10 非文件式属性
用函数get和set对每一个对象列出的属性是文件式属性。也有由MATLAB开发者所用的非文件式属性。其中一些可以被设置,但另外一些是只读的。
每一对象类型的一个有用的非文件式属性是 'Tag' 属性。这个属性用用户自定义的文本字符串来标志一个对象时有用。例如:
? set(gca, 'Tag' , 'My axes' )
就把字符串 'My axes' 加到当前图形的当前坐标轴。这个字符串不在图形或坐标轴中上显示出来,但可以查询 'Tag' 属性来辨别对象。例如,有许多个坐标轴,可以通过
? Ha_myaxes=findobj(0, 'Tag' , 'My Axes' );
来寻找上面的坐标轴对象的句柄。象在下一章讨论的 'UserData' 属性一样, 'Tag' 属性备作专门使用。没有任何MATLAB函数和M文件改变或对这些属性所含值作出假设。然而,如在下章要讨论的,有一些用户提供的M文件和几个精通MATLAB工具箱函数使用 'UserData'
属性来存储临时数据。
由于一些非文件式属性是故意作成非文件式的,所以在使用时必须非常小心。它们有时比文件式属性脆弱,并且常常引起变化。在以后的MATLAB版本中,非文件式属性也许会仍保持或消失,或者改变功能,甚至会成为文件式属性。
在MATLAB 5.0中应变成文件式属性的非文件式属性列在表20.2中。
表20.2
属性 对象
'TerminalHideGraphCommand' 根
'TerminalDimensions' 根
'TerminalShowGraphCommand' 根
'Tag' 所有对象
'Layer' 坐标轴
'PaletteModel' 曲面,补片
--
--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: bage.bbs@smth.org]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:205.708毫秒