前言
绘图函数将不同的曲线或曲面绘制在图形窗口中,而图形窗口是由不同的对象(如坐标轴、曲线、曲面或文字等)组成的图形界面。MATLAB给每个图形对象分配一个标识符,称为句柄。以后可以通过句柄对该图形对象的属性进行设置,也可以获取有关的属性值,从而能够更加自主地绘制各种图形。
1.图形对象及其句柄
MATLAB的图形对象包括计算机屏幕、图形窗口、坐标轴、用户菜单、用户控件、曲线、曲面、文字、图像、光源、区域块和方框等。系统将每一个对象按树型结构组织起来。每个具体图形不必包含每个对象,但每个图形必须具备根对象和图形窗口。如下图所示,是句柄图形体系的对象树结构。
MATLAB在创建每一个图形 对象时,都会为该对象分配唯一 的一个值,称其为图形对象句柄(Handle)。句柄是图形对象的唯一标识符,不同对象的句柄不可能重复和混淆。
计算机屏幕作为根对象由系统自动建立,其句柄值为0,而图形窗口对象的句柄值为一正整数,并显示在该窗口的标题栏,其他图形对象的句柄为浮点数。MATLAB提供了若干个函数用于获取已有图形对象的句柄,如figure、line、text、surface. axes( xlabel、ylabel 、zlabel 、title)。
若要获取当前的图形、坐标轴和对象的句柄值,可使用下列函数:
- gcf:获取当前图形窗口的句柄值;
- gca:获取当前图形窗口中当前坐标轴的句柄值;
- gco:获取当前图形窗口中当前对象的句柄值;
- gcbf:获取正在执行的回调函数对应的对象所在窗口的句柄值;
- gcbo:获取正在执行的回调函数对应的对象句柄值。
例 绘制曲线并查看有关对象的句柄
x = 0:0.2*pi:3*pi;
y = cos(x);
h1 = gcf
h2 = gca
1.1属性的设置与查询
MATALB中set函数用于设置已创建句柄图形对象元素的各种属性,get函数用于查询已创建句柄图形对象元素的各种属性。
set函数的调用格式为
set(句柄,属性名1,属性值1,属性名2,属性值2,…)
其中句柄用于指明要操作的图形对象。如果在调用set函数时省略全部属性名和属性值,则将显示出句柄所有的允许属性。
根对象的所有可设置属性值为
set(0)
CurrentFigure
Diary:[on|off]
DiaryFile
Echo: [ on| off ]
FixedWidthFontName
Format: [ short| long | shortE| longE| shortG| longG|hex|bank|+| rational|debug|shortEng| longEng]
FormatSpacing: [loose|compact ]
Language
More: [ on| off ]
PointerLocation
RecursionLimit
ScreenDepth
SereenPixelsPerInch
ShowHiddenHandles: [ on| {off} ]
Units: [ inches| centimeters| normalized| points| pixels|characters]
ButtonDownFcn: string -or- function handle -or- cell array
Children
Clipping: [ {on} I off ]
CreateFcn: string -or- function handle -or- cell array
DeleteFcn: string -or- function handle -or- cell array
BusyAction: [ {queue}| cancel ]
HandleVisibility: [ {on}| callback| off ]
HitTest: [ {on} | off ]
Interruptible: [ {on}| off ]
Parent
Selected: [ on| off ]
SelectionHighlight: [ {on} | off ]
Tag
UIContextMenu
UserData
Visible: [ {on} ! off ]
get函数的调用格式为: get(H):过去属性列表。
V=get(句柄,属性名): V是返回的属性值。如果在调用get函数时省略属性名,则将返回句柄所有的属性值。
获取根对象的属性列表如下:
get(0)
CallbackObject = []
CommandWindowSize = [126 31]
CurrentFigure= []
Diary = off
DiaryFile = diary
Echo = off
FixedWidthFontName = SimHei
Format = short
FormatSpacing = loose
Language = zh_cn
MonitorPositions = [1 1 1600 900]
More = off
PointerLocation = [546 211]
RecursionLimit = [500]
ScreenDepth = [32]
ScreenPixelsPerInch = [116]
ScreenSize = [1 1 1600 900]
ShowHiddenHandles = off
Units = pixels
BeingDeleted = off
ButtonDownFcn =
Children = []
Clipping = on
CreateFcn =
DeleteFcn =
BusyAction = queue
HandleVisibility = on
HitTest = on
Interruptible = on
Parent =[ ]
Selected = off
SelectionHighlight = on
Tag =
Type = root
UIContextMenu = []
UserData = []
Visible = on
例 绘制二维曲线,通过选择不同的选项可以设置曲线的颜色,线型和数据点的标记符号
x = 0:pi/10:2*pi;
h = plot(x,cos(x));
set(h,'color','r','linestyle',':','marker','p');
get(h,'marker')
运行结果如下:
设置属性示例(图片的属性设置)
figure( 'Position',[1 2 650 350], 'Units', 'inches')
set(gcf, 'Units', 'pixels')
get(gcf, 'Position')
set(gcf, 'Units', 'pixels', 'Position',[1 1 500 300],'Units','inches ')
get(gcf, 'Position')
1.2 对象的默认属性值
MATLAB对默认属性值的搜索从当前对象开始,沿着对象的从属关系图向更高的层次搜索,直到发现系统的默认值或用户自已定义的值。
定义对象的默认值时,在对象从属关系图中,该对象越靠近Root(根)对象,其作用的范围就越广。
如果用户在对象从属关系图的不同层次上定义同一个属性的默认值,MATLAB
将会自动选择最下层的属性值作为最终的属性值。需要注意的是,用户自定义的属性值只能影响到该属性设置后创建的对象,之前的对象都不会受到影响。
指定MATLAB对象的默认值,首先需要创建一个以Default 开头的字符串,该字符串的中间部分为对象类型,末尾部分为属性的名称。属性默认值的描述结构为:
Default+对象名称+对象属性
例如
- DefaultFigureColor:图形窗口的颜色;
- DefaultAxesAspaceRatio:轴的视图比率;
- DefaultLineLineWide:线的宽度;
- DefaultLineColor:线的颜色。
例 在轴对象上(父代对象)设置线的颜色默认值为蓝色。
x=0:2*pi/180:2*pi;
y=cos(2*x);
set(gca,'DefaultLineColor',[1 0 0]);
h = line(x,y)
1.3 对象的属性查找
MATLAB的findobj函数用于快速遍历对象从属关系表并获取具有特定属性值的对象句柄。如果用户没有指定起始对象,那么findobj函数从根对象开始查找。该函数的调用格式为
- findobj: findobj返回根对象的句柄和所有子对象;
- h = findobj: 返回根对象的句柄和所有子对象;
- h = findobj( ‘PropertyName’ , PropertyVale,…):返回所有属性为"PropertyName’,属性值为’PropertyValue’的图形对象的句柄;
- h = findobj( ‘-regexp’ , ‘PropertyName’,‘regexp’,…):属性名可以使用正则表达式;
- h = findobj( ‘-property’, ‘PropertyName’):如果存在‘PropertyName’这个属性名,就返回此图形句柄;
- h = findobj(objhandles,…):限制搜索范围为objhandles和他们的子图中;
- h = findobj(objhandles, ‘-depth’,d,…):指定搜索深度,深度参数’d’控制遍历层数,若d为inf表示遍历所有层,若d为0等同d= ‘flat’;
- h = findobj(objhandles, ‘flat’ , ‘PropertyName’ ,PropertyValue…)=: 'flat’限制搜索范围只能是当前层,不能搜索子图。如果句柄指向一个不存在的形,findobj则返回一个错误。findobj正确匹配任何合法属性值,例如findobj(‘Color’,'r)找到所有color值为红的对象。为了寻找满足指定条件的handle对象,可以使用handle.findobj。
例 findobj 函数使用实例
clf reset
x = -2*pi:0.4:2*pi;
y1 = sin(x+1);
y2 = cos(x);
plot(x,y1,x,y2,'g',x,zeros(size(x)),'k:');
hg = findobj(gca,'color','g') %在当前轴上寻找绿线的句柄
由图可以看出y2为返回的数据hg的值
1.4 图像对象的复制
通过copyobj函数可以实现将对象从一个父对象移动至另一个父对象中。新对象与原对象的唯一差别在于其Parent属性值不同,并且其句柄不同。在MATLAB中,可以向一个新的父对象中复制多个子对象,也可以将-一个子对象复制到多个父对象中。复制对象需要注意的是,子对象和父对象之间的类型必须匹配。在复制对象时,如果被复制的对象包含子对象,MATLAB将同时复制所有的子对象。
copyobj函数的用法为:
new_ handle = copyobj(h,p): 该语句复制h指定的图形对象至p指定的对象中,成
为p的子对象。h和p的取值可以有下面三种情况:
- h和p均为向量。此时h和ρ长度必须相同,返回值new_handle为长度相同的 向量。在这种情况下,new_ handle(i)是h(i)的副本,其父对象为p(i);
- h为标量,p为向量,此时将h复制到p指定的所有对象中,返回结果new_handle为与p长度相等的向量,每个new_ handle(i)是 h的副本,其父对象为p(i);
- h为向量,p为标量,此时将h指定的所有对象复制到p中,返回结果new_handle为与h长度相等的向量,每个new_ handle(i)是h(i)的副本,其父对象为p。
1.5图形对象的删除
在MATLAB中,利用delete函数,可以删除图形对象。
其格式为delete(h):该语句删除h所指定的对象。