加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

MATLAB中 gcf、gca以及 gco的区别 (句柄)

(2014-10-10 15:36:02)
标签:

matlab

分类: MATLAB及信号分析

MATLAB中 gcf、gca以及 gco的区别 

gcf返回当前 Figure对象的句柄值

 gca返回当前 axes对象的句柄值 

gco返回当前鼠标单击的句柄值,该对象可以是除 root对象外的任意图形对象,并且 Matlab会把当前图形对象的句柄值存放在 Figure的 CurrentObject属性中。 

可以用一下语句查看所有的特性
get(gca) %取的axes的相关属性的设定
get(gcf) %取的视窗的相关属性的设定
get(gco) %这个必须配合滑鼠触发的方式~来获的物件相关的属性  

 

图形对象

图形对象是用以显示图形和用户界面元素的基本元素。下表列出了各种图形对象。 

 

对象

描述 

Root 

对计算机屏幕最高级的对象 

 

Figure 

用来显示图形和用户界面的窗口 

 

Axes 

在窗口中显示图形的轴 

 

Uicontrol 

用户界面控制。执行一个对用户交互作用的函数。 

 

Uimenu 

用户定义窗口菜单 

 

Uicontextmenu 

右键单击对象时弹出的菜单 

 

Image 

二维像素基础图 

 

Light 

影响斑点和表面对象着色的光源 

 

Line 

用于如 plot, plot3, semilogx等函数的线 

 

Patch 

带边缘的填充多边形 

 

Rectangle 

二维形状,从矩形到椭圆 

 

Surface 

由 x-y平面以上的数据值所作图创建的矩阵数据的三维表示 

 

Text 

字符串 

 

对象级别

不同对象分布在一个树形结构级别里,反映它们的独立性。例如,线对象是在轴对象的框架下的。依次,轴对象只存在于 figure对象中。 

要想对gcf、gca以及 gco之间的区别进一步的了解,MATLAB中的句柄图形的了解是必要的,以下部分是 MATLAB句柄图形中关于gcf、gca以及 gco的部分,供大家参考。 

句柄图形 

什么是句柄图形?句柄图形是对底层图形例程集合的总称,它实际上进行生成图形的工作。这些细节通常隐藏在图形 M文件的内部,但如果想使用它们也是可得到的。 

MATLAB用户指南给人的一种印象是,句柄图形非常复杂,只对熟练的高级用户才有用。而实际上不是这样的。句柄图形可以被任何人用来改变 MATLAB生成图形的方式,不论是只想在一幅图里做一点小变动,还是想做影响所有图形输出的全局变动。 

句柄图形允许你定制图形的许多特性,而这用高级命令和前几章里描述的函数是无法实现的。例如,如果想用橘黄色来画一条线,而不是 plot命令中可用的任何一种颜色,该怎么做呢?句柄图形就可以提供一种方法。 

本章不对句柄图形作详细讨论,因为那样涉及问题太细。这里的目的只是对句柄图形概念作基本了解,并提供足够多的信息,使得即使是偶尔使用一下MATLAB的用户也可以利用句柄图形。在这个背景下,在本章最后给出了关于句柄图形对象属性和它们的值,它不仅很有用也很有意义。 

20.1 谁需要句柄图形? 

开始,我们要强调本章主要是针对那些不满足于 MATLAB普通图形特性的读者。如果对所画的图形已经很满意,那么就跳过当前的讨论。如果以后要定制图形,只要记住这里有可用的信息。 

现在,对于那些还在犹豫的用户,我们要强调学习使用句柄图形并不困难。如果只想改变图形的标题字体,或者改变一个图形窗口的背景颜色,那么,你不必成为一个句柄图形的专家也可做到。 

另一方面,如果想定制图形,并且要打算对图形的每个可能方面进行控制,那么句柄图形会为此提供强有力的工具。 

前面那些章提供的图形功能被认为是高级的命令和函数,包括plot,mesh,axis及其它。这些函数是建立在底层函数和属性的基础上,总称为句柄图形。 

20.2 什么是句柄图形对象 

句柄图形是基于这样的概念,即一幅图的每一组成部分是一个对象,每一个对象有一系列句柄和它相关,每一个对象有按需要可以改变的属性。 

当今计算机行业最流行的术语之一便是对象这个词。面向对象的编程语言,

数据库对象,操作系统和应用程序接口都使用了对象的概念。一个对象可以被粗略地定义为由一组紧密相关、形成唯一整体的数据结构或函数集合。在MATLAB中,图形对象是一幅图中很独特的成分,它可以被单独地操作。 

由图形命令产生的每一件东西都是图形对象。它们包括图形窗口或仅仅说是图形,还有坐标轴、线条、曲面、文本和其它。这些对象按父对象和子对象组成层次结构。计算机屏幕是根对象,并且是所有其它对象的父亲。图形窗口是根对象的子对象;坐标轴和用户界面对象(在下一章讨论)是图形窗口的子对象;线条、文本、曲面、补片和图象对象是坐标轴对象的子对象。 

根可包含一个或多个图形窗口,每一个图形窗口可包含一组或多组坐标轴。所有其它的对象(除了在下一章讨论的 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 dif fent 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 issued. 

Use the commands AXES or SUBPLOT to change the current axis to 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 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 0] 

        Hl_green=Hl_lines(k) 

end 

end Hl_green= 58.0001 

 

get(gca)
 ActivePositionProperty = position
 ALim = [0 1]
 ALimMode = auto
 AmbientLightColor = [1 1 1]
 Box = on
 CameraPosition = [1000 10000 17.3205]
 CameraPositionMode = auto
 CameraTarget = [1000 10000 0]
 CameraTargetMode = auto
 CameraUpVector = [0 1 0]
 CameraUpVectorMode = auto
 CameraViewAngle = [6.60861]
 CameraViewAngleMode = auto
 CLim = [0 1]
 CLimMode = auto
 Color = [1 1 1]
 CurrentPoint = [ (2 by 3) double array]
 ColorOrder = [ (7 by 3) double array]
 DataAspectRatio = [1000 10000 1]
 DataAspectRatioMode = auto
 DrawMode = normal
 FontAngle = normal
 FontName = Helvetica
 FontSize = [10]
 FontUnits = points
 FontWeight = normal
 GridLineStyle = :
 Layer = bottom
 LineStyleOrder = -
 LineWidth = [0.5]
 MinorGridLineStyle = :
 NextPlot = replace
 OuterPosition = [0.0970444 0.092582 0.374206 0.253895]
 PlotBoxAspectRatio = [1 1 1]
 PlotBoxAspectRatioMode = auto
 Projection = orthographic
 Position = [0.13 0.11 0.334659 0.211887]
 TickLength = [0.01 0.025]
 TickDir = in
 TickDirMode = auto
 TightInset = [0.01875 0.017418 0.00104167 0.0245902]
 Title = [187.011]
 Units = normalized
 View = [0 90]
 XColor = [0 0 0]
 XDir = normal
 XGrid = off
 XLabel = [188.011]
 XAxisLocation = bottom
 XLim = [0 2000]
 XLimMode = auto
 XMinorGrid = off
 XMinorTick = off
 XScale = linear
 XTick = [20 10010 20000]
 XTickLabel = 20
 XTickLabelMode = auto
 XTickMode = manual
 YColor = [0 0 0]
 YDir = normal
 YGrid = off
 YLabel = [189.011]
 YAxisLocation = left
 YLim = [0 20000]
 YLimMode = auto
 YMinorGrid = off
 YMinorTick = off
 YScale = linear
 YTick = [20 10010 20000]
 YTickLabel =
  0.002
  1.001
    
 YTickLabelMode = auto
 YTickMode = manual
 ZColor = [0 0 0]
 ZDir = normal
 ZGrid = off
 ZLabel = [190.011]
 ZLim = [-1 1]
 ZLimMode = auto
 ZMinorGrid = off
 ZMinorTick = off
 ZScale = linear
 ZTick = [-1 0 1]
 ZTickLabel =
 ZTickLabelMode = auto
 ZTickMode = auto

 BeingDeleted = off
 ButtonDownFcn =
 Children = [186.012]
 Clipping = on
 CreateFcn =
 DeleteFcn =
 BusyAction = queue
 HandleVisibility = on
 HitTest = on
 Interruptible = on
 Parent = [1]
 Selected = off
 SelectionHighlight = on
 Tag =
 Type = axes
 UIContextMenu = []
 UserData = []
 Visible = on

 

 

get(gcf)
 Alphamap = [ (1 by 64) double array]
 CloseRequestFcn = closereq
 Color = [0.8 0.8 0.8]
 Colormap = [ (64 by 3) double array]
 CurrentAxes = [185.011]
 CurrentCharacter =
 CurrentObject = []
 CurrentPoint = [0 0]
 DockControls = on
 FileName =
 IntegerHandle = on
 InvertHardcopy = on
 KeyPressFcn =
 KeyReleaseFcn =
 MenuBar = figure
 Name =
 NextPlot = add
 NumberTitle = on
 PaperUnits = centimeters
 PaperOrientation = portrait
 PaperPosition = [0.634517 6.34517 20.3046 15.2284]
 PaperPositionMode = manual
 PaperSize = [20.984 29.6774]
 PaperType = A4
 Pointer = arrow
 PointerShapeCData = [ (16 by 16) double array]
 PointerShapeHotSpot = [1 1]
 Position = [1 31 1920 976]
 Renderer = painters
 RendererMode = auto
 Resize = on
 ResizeFcn =
 SelectionType = normal
 ToolBar = auto
 Units = pixels
 WindowButtonDownFcn =
 WindowButtonMotionFcn =
 WindowButtonUpFcn =
 WindowKeyPressFcn =
 WindowKeyReleaseFcn =
 WindowScrollWheelFcn =
 WindowStyle = normal
 WVisual = 00 (RGB 32  GDI, Bitmap, Window)
 WVisualMode = auto

 BeingDeleted = off
 ButtonDownFcn =
 Children = [ (5 by 1) double array]
 Clipping = on
 CreateFcn =
 DeleteFcn =
 BusyAction = queue
 HandleVisibility = on
 HitTest = on
 Interruptible = on
 Parent = [0]
 Selected = off
 SelectionHighlight = on
 Tag =
 Type = figure
 UIContextMenu = []
 UserData = []
 Visible = on

 

 

 

 

 

 

 

 

另外附上findobj

b=findobj 

b = 
       0 %电脑营幕握把值~一定是0 
       1.0000 %视窗握把值 
   170.0024 % axes握把值 
   172.0024 %线条一握把值 
   171.0029 %线条二握把值 

findobj这是寻找物件的握把值得函数 

也可以这样用 
>> findobj('type','line') %显示物件类型为line的握把值 
ans = 
   172.0024 
   171.0029 


只要能获的握把值就可以利用inspect(h) 
调出相关的属性设定的视窗 


注意: 
如果获的握把值以后如上 
不可以输入inspect(172.0024) 
这样是错误的方式 
因为握把值不是只有小数四位 
只要输入format long 
就可以发现握把值变成 
>> format long 
>> findobj('type','line') 
ans = 
   1.0e+002 * 
    1.720024414062500 
    1.710029296875000 
因此输入的方式必须是变量~ 
例如 

>>aaa = findobj('type','line') 
>>inspect(aaa(1)) 

这样才对~有和任何说错或是不完全的地方~再一起讨论~

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有