这里写目录标题
一、图形对象及其句柄 1. 图形对象 2. 图形对象句柄的使用 3. 图形对象属性 3.1 属性名与属性值 3.2 属性的操作 3.3 图形对象的公共属性
二、图形窗口与坐标轴
一、图形对象及其句柄
MATLAB 的图形系统是面向图形对象的。图形对象是 MATLAB 图形元素的集合,是用于显示图形和设计用户界面的基本要素。
1. 图形对象
在 MATLAB 中,每一个具体的图形都是若干个不同的图形对象组成的。所有的图形对象都按父对象和子对象的方式组成层次结构,其形式如下图所示。
在图形对象的层次结构中,计算机屏幕是产生其他对象的基础,称为根对象(root)。MATLAB 图形系统只有一个根对象,其他对象都是它的子对象。当 MATLAB 启动时,系统自动创建根对象。 图形窗口(figure)是显示图形和用户界面的窗口。用户可建立多个图形窗口,所有图形窗口对象的父对象都是根对象,而其他图形对象都是图形窗口的子对象。图形窗口对象有 3 种子对象:用户界面对象(user interface,UI)、坐标轴(axes)和标注对象(annotation)。 用户界面对象用于构建图形用户界面。 坐标轴有 3 种子对象:核心对象(core object)、绘图对象(plot object)和组对象(group object)。对坐标轴及其 3 种子对象的操作即构成低层绘图操作,也就是对图形句柄的操作。 标注对象用于给图形添加标注,从而增强图形的表现能力。通常可以利用图形窗口的工具栏或“插入”菜单给图形添加标注,但也可用 annotation 函数通过创建标注对象来添加标注。 根对象可包含一个或多个图形窗口,每一一个图形窗口可包含一组或多组坐标轴,每一组坐标轴上又可绘制多种图形,包括曲线、曲面、文本、图像、区域块、方块和光源对象等基本的绘图对象,它们都是坐标轴的子对象。 创建图形对象的低层绘图函数与所创对象有相同名称。例如,line 函数创建曲线对象(line)、text 函数创建文本对象(text)等。 绘图对象是由核心图形对象组合而成,使用绘图对象的属性可以简单、快速地访问核心图形对象的重要属性。组对象允许将坐标轴的多个子对象作为一个整体进行处理。 例如,可以是整个组可见或不可见,单击组对象时可选择改组所有对象,或用一个变换矩阵改变对象的位置。
2. 图形对象句柄的使用
在以前的 MATLAB 版本中,图形对象句柄是一个数值,而从 MATLAB R2014b 起,图形对象句柄就代表图形对象,句柄变量相当于对象名,可以是一个图形对象的标识。例如下面程序所示。
>> x= 0 : pi/ 10 : 2 * pi;
>> y= sin ( x) ;
>> h0= plot ( x, y, 'r' ) % 曲线对象的句柄
h0 =
Line - 属性:
Color: [ 1 0 0 ]
LineStyle: '-'
LineWidth: 0.5000
Marker: 'none'
MarkerSize: 6
MarkerFaceColor: 'none'
XData: [ 0 0.3142 0.6283 0.9425 1.2566 1.5708 1.8850 2.1991 2.5133 2.8274 3.1416 3.4558 … ]
YData: [ 0 0.3090 0.5878 0.8090 0.9511 1 0.9511 0.8090 0.5878 0.3090 1.2246e-16 - 0.3090 … ]
显示 所有属性
plot
函数绘制二维曲线,返回图形句柄,存入变量 h0 中,h0 表示一个具体的曲线对象。通过图形句柄可以访问图形对象的属性。例如下面程序所示。
>> h0, Color
h0 =
1 2 3
说明 h0 对象的 Color 属性是 [1,0,0],即曲线的颜色是红色。也可以通过下面的命令来改变曲线对象的颜色。
>> h0, Color= [ 0 , 1 , 0 ] ;
就可以将颜色从红色改为绿色。 MATLAB 提供了若干个函数用于获取已有图形对象的句柄,常用的函数如下。 (1) gcf:获取当前图形窗口的句柄(get current figure)。 (2) gca:获取当前坐标轴的句柄(get current axis)。 (3) gco:获取最近被选中的图形对象的句柄(get current object)。 (4) findobj:按照指定的属性来获取图形对象的句柄。 例如:
>> h1= gcf
h1 =
Figure ( 1 ) - 属性:
Number: 1
Name: ''
Color: [ 0.9400 0.9400 0.9400 ]
Position: [ 488 342 560 420 ]
Units: 'pixels'
显示 所有属性
3. 图形对象属性
每种图形对象都具有各种各样的属性,MATLAB 正是通过对属性的操作来控制和改变图形对象的。
3.1 属性名与属性值
为方便属性的操作,MATLAB 给每种对象的每一个属性规定了一个名字,称为属性名,而属性名的取值称为属性值。例如,LineStyle 是曲线对象的一个属性名,它的值决定着线型,取值可以是 ‘-’、‘:’、‘-.’ 、‘–’ 或 ‘none’。 在属性名的写法中,不区分字母的大小写,而且在不引起歧义的前提下,属性名不必写全。例如,lines 就代表 LineStyle.此外,属性名要用单引号括起来。
3.2 属性的操作
当创建一一个对象时,必须给对象的各种属性赋予必要的属性值,否则,系统自动使用默认属性值。用户可以通过 set
函数重新设置对象属性,同时也可以通过 get
函数获取这些属性值。 set
函数的调用格式如下:
set ( 句柄, 属性名1 , 属性值1 , 属性名2 , 属性值2 , . . . )
其中,句柄用于指明要操作的图形对象。如果在调用 set
函数时省略全部属性名和属性值,则将显示出句柄所有的允许属性。 绘制二维曲线时,通过选择不同的选项可以设置曲线的颜色、线型和数据点的标记符号,下面用图形句柄操作来实现。假定要绘制正弦曲线,程序如下:
x= 0 : pi/ 10 : 2 * pi;
h= plot ( x, sin ( x) ) ;
set ( h, 'Color' , 'r' , 'LineStyle' , ':' , 'Marker' , 'p' ) ;
先用默认属性绘制正弦曲线并保存曲线句柄,然后通过改变曲线的属性来设置曲线的颜色、线型和数据点的标记符号。事实上,还有很多其他属性,通过改变这些属性,可对曲线作更进一步的控制。 get
函数的调用格式如下:
V= get ( 句柄, 属性名)
其中,V 是返回的属性值。如果在调用 get
函数时省略属性名,则将返回句柄所有的属性值。用 get
函数来获得上述曲线的属性值。例如:
>> col= get ( h, 'Color' )
col =
1 0 0
将得到曲线的颜色属性值 [1,0,0],即红色。也可以使用以下命令:
>> col= h. Color
col =
1 0 0
>> V= get ( 0 , 'ScreenSize' )
V =
1 1 1536 864
get
函数返回一个
1
×
4
1×4
1 × 4 的向量
V
V
V ,其中前两个分量分别是屏幕的左下角横纵坐标
(
1
,
1
)
(1,1)
( 1 , 1 ) ,而后两个分量分别是屏幕的宽度和高度。假如屏幕分辨率设置为
1280
×
1024
1280×1024
1280 × 1024 ,则
V
V
V 的值为 [1,1,1280,1024],这有助于依据现行屏幕的分辨率来设置窗口的大小。
3.3 图形对象的公共属性
图形对象具有各种各样的属性,有些属性是所有对象共同具备的,有些则是各对象所特有的。 (1) Children 属性:该属性的取值是该对象所有子对象的句柄组成的一个向量。 (2) Parent 属性:该属性的取值是该对象的父对象的句柄。 (3) Tag 属性:该属性的取值是一个字符串,它相当于给该对象定义了一个标识符。定义了 Tag 属性后,在任何程序中都可以通过 findobj
函数获取该标识符所对应图形对象的句柄。 例如,hf=findobj(0,Tag',Flag1')
将 在屏幕对象及其子对象中寻找 Tag 属性为 Flag1 的对象,并返回句柄。 (4) Type 属性:表示该对象的类型。显然,该属性的值是不可改变的。 (5) UserData 属性:该属性的取值是一个矩阵,默认值为空矩阵。在程序设计中,可以将一个图形对象有关的比较重要的数据存储在这个属性中,借此可以达到传递数据的目的。 具体做法是,先用 set
函数给某一句柄添加一些附加数据(一个矩阵),如果想使用这样的矩阵,再用 get
函数调用出来。 (6) Visible 属性:该属性的取值是 ‘on’(默认值)或 ‘off’。决定着图形窗口是否在屏幕上显示出来。 当它的值为 ‘off’ 时,可以用来隐藏该图形窗口的动态变化过程,如窗口大小的变化、颜色的变化等。注意,对象存在与否与对象是否可见是两回事,对象可以存在,同时又是不可见的。 (7) ButtonDownFen 属性:该属性的取值是一个字符串,一般是某个脚本文件名或一组 MATLAB 命令。图形对象决定了一个作用区域,当单击该区域时,MATLAB 自动执行该程序或命令。 (8) CreateFcn 属性:该属性的取值是一个字符串,一般是某个脚本文件名或一组 MATLAB 命令。当创建该对象时,MATLAB 自动执行该程序或命令。 (9) DeleteFcn 属性:该属性的取值是一个字符串,一般是某个脚本文件名或一组 MATLAB 命令。当取消该对象时,MATLAB 自动执行该程序段或命令。 例如,我们在同一坐标下绘制红、绿两根不同的曲线,希望获得绿色曲线的句柄,并对其进行设置。 程序如下:
x= 0 : pi/ 50 : 2 * pi;
y= sin ( x) ;
z= cos ( x) ;
plot ( x, y, 'r' , x, z, 'g' ) ; % 绘制两根不同的曲线
Hl= get ( gca, 'Children' ) ; % 获取两曲线句柄向量Hl
for k= 1 : size ( Hl)
if get ( H1 ( k) , 'Color' ) == [ 0 , 1 , 0 ] % [ 0 , 1 , 0 ] 代表绿色
H1g= Hl ( k) ; % 获取绿色线条句柄
end
end
pause % 便于观察设置前后的效果
set ( Hlg, 'LineStyle' , ':' , 'Marker' , 'p' ) ; % 对绿色线条进行设置
二、图形窗口与坐标轴
除根对象外,所有图形对象都可以由与之同名的低层函数创建。所创建的对象置于适当的父对象之中,当父对象不存在时,MATLAB 会自动创建它。例如,用 line
函数画一根曲线,假如在画线之前,坐标轴、图形窗口不存在,MATLAB 会自动创建它们。 假如在画线之前,坐标轴、图形窗口已经存在,那么将在当前坐标轴上画线,且不影响该坐标轴上已有的其他对象。这一点与高层绘图函数完全不同,需特别注意。创建对象的低层函数调用格式类似,关键要了解对象的属性及其取值。
1. 图形窗口对象
图形窗口是 MATLAB 中很重要的一类图形对象。MATLAB 的一切图形图像的输出都是在图形窗口中完成的。掌握好图形窗口的控制方法,对于充分发挥 MATLAB 的图形功能和设计高质量的用户界面是十分重要的。 建立图形窗口对象使用 figure
函数,其调用格式如下:
句柄变量= figure ( 属性名1 , 属性值1 , 属性名2 , 属性值2 , . . . )
MATLAB 通过对属性的操作来改变图形窗口的形式,也可以使用 figure
函数按 MATLAB 默认的属性值建立图形窗口,其调用格式如下:
figure
句柄变量= figure
MATLAB 通过 figure
函数建立图形窗口之后,还可以调用 figure
函数来显示该窗口,并将之设定为当前窗口,调用格式如下:
figure ( 窗口句柄)
如果这里的句柄不是已经存在的图形窗口句柄,而是一个整数,则也可以使用这一函数,它的作用是以这一整数为图形窗口序号生成一个新的图形窗口,并将之定义为当前窗口。 如果引用的窗口句柄不是一个图形窗口的句柄,也不是一个整数,则该函数返回一条错误信息。要关闭图形窗口,使用 close
函数,其调用格式如下:
close ( 窗口句柄)
另外,closeall
命令可以关闭所有的图形窗口,clf
命令则是清除当前图形窗口的内容,但不关闭窗口。 MATLAB 为每个图形窗口提供了很多属性。这些属性及其取值控制着图形窗口对象。除公共属性外,其他常用属性如下。 (1) MenuBar 属性:该属性的取值可以是 ‘figure’ (默认值)或 ‘none’,用来控制图形窗口是否应该具有菜单条。 如果它的属性值为 ‘none’,则表示该图形窗口没有菜单条。这时用户可以采用 uimenu
函数来加入自己的菜单条。 如果它的属性值为 ‘figure’,则该窗口将保持图形窗口默认的菜单条,这时也可以采用 uimenu
函数在原默认的图形窗口菜单后面添加新的菜单项。 (2) Name 属性:该属性的取值可以是任何字符串,它的默认值为空。这个字符串作为图形窗口的标题,一般情况下, 其标题形式为 "Figuren: 字符串”。 (3) NumberTitle 属性:该属性的取值是 ‘on’(默认值)或 'off ',决定着在图形窗口的标题中是否以 “Figure n:” 为标题前缀,这里 n 是图形窗口的序号。 (4) Resize 属性:该属性的取值是 ‘on’(默认值)或 ‘off’, 决定着在图形窗口建立后可否用鼠标改变该窗口的大小。 (5) Position 属性:该属性的取值是一个由 4 个元素构成的向量,其形式为[ x,y,w,h]。这个向量定义了图形窗口对象在屏幕上的位置和大小,其中 x、y 分别为窗口左下角的横纵坐标值,w、h 分别为窗口的宽度和高度,它们的单位由 Units 属性决定。 (6) Units 属性:该属性的取值可以是下列字符串中的任何一种:‘pixels’(像素,为默认值)、‘normalized’(相对单位)、‘inches’(英寸)、‘centimeters’(厘米)和 ‘points’(磅)。 Units 属性定义图形窗口使用的长度单位,由此决定图形窗口的大小与位置。除了 normalized 以外,其他单位都是绝对度量单位。 相对单位 normalized 将屏幕左下角对应为 (0,0),而右上角对应为 (1.0, 1.0)。该属性将影响一切定义大小的属性项,如前面的 Position 属性。如果在程序中改变过 Units 属性值,在完成相应的计算后,最好将 Units 属性值设置为默认值,以防止影响其他函数计算。 (7) Color 属性:属性的取值是一个颜色值,既可以用字符表示,也可以用 RGB 三元组表示,默认为浅灰色,用于设定图形窗口背景的颜色。 (8) Pointer 属性::属性的取值是 ‘arrow’(默认值)、‘crosshair’、‘watch’、‘topl’、‘topr’、‘botl’、‘botr’、‘circle’、‘cross’ 、‘fleur’ 、'custom’等, 用于设定鼠标标记的显示形式。 (9) 对键盘及鼠标响应属性:MATLAB 允许对键盘和鼠标键按下这样的动作进行响应,这类属性有 KeyPressFcn(键盘键按下响应)、WindowButtonDownFcn(鼠标键按下响应)、WindowButtonMotionFcn(鼠标移动响应)及 WindowButtonUpFcn(鼠标键释放响应)等。 这些属性所对应的属性值可以为用 MATLAB 编写的程序或命令,表示一旦键盘键或鼠标键按下之后,将自动执行给出的程序或命令。 例如,我们建立一个图形窗口。 该图形窗口设有菜单条,标题名称为“图形窗口示例”,起始于屏幕左下角,宽度和高度分别为 300 像素点和 150 像素点,背景颜色为绿色,且当用户从键盘按下任意一个键时,将显示 “Hello,World!" 字样。 程序如下:
hf= figure ( 'Color' , [ 0 , 1 , 0 ] , 'Position' , [ 1 , 1 , 300 , 150 ] , . . .
'Name' , '图形窗口示例' , 'NumberTitle' , 'off' , 'MenuBar' , 'none' , . . .
'KeyPressFcn' , 'disp(' 'Hello,World!' ')' ) ;
例如,我们分别在4个不同的图形窗口绘制出正弦、余弦、正切、余切曲线。要求先建立一个图形窗口并绘图,然后每关闭一个再建立下一个,直到建立第4个窗口并绘图。 程序如下:
x= linspace ( 0 , 2 * pi, 60 ) ;
y= sin ( x) ;
z= cos ( x) ;
t= tan ( x) ;
ct= 1. / ( t+ eps) ;
% 命令组待用
C4= [ 'figure(' 'Name' ',' 'cotangent (x)' ',' 'NumberTitle' ',' , . . .
'' 'off' ') ; plot ( x, ct) ; axis ( [ 0 , 2 * pi, - 40 , 40 ] ) ; '] ;
C3= [ 'figure(' 'Name' ',' 'tangent(x)' ',' 'DeleteFcn' ',C4,' , . . .
'' 'NumberTitle' ',' 'off' ') ; plot ( x, t) ; axis ( [ 0 , 2 * pi, - 40 , 40 ] ) ; '] ;
C2= [ 'figure(' 'Name' ',' 'cos(x)' ',' 'DeleteFcn' ',C3,' . . . .
'' 'NumberTitle' ',' 'off' ');plot(x,z);axis([0,2*pi,-1,1]);' ] ;
% 先创建一个图形窗口并绘制曲线
figure ( 'Name' , 'sin(x)' , 'DeleteFcn' , C2, 'NumberTitle' , 'off' ) ;
plot ( x, y) ;
axis ( [ 0 , 2 * pi, - 1 , 1 ] ) ;
sin(x)、cos(x)、tan(x) 和 cot(x) 依次关闭并打开。
2. 坐标轴对象
坐标轴是 MATLAB 中另一类很重要的图形对象。坐标轴对象是图形窗口的子对象,每个图形窗口中可以定义多个坐标轴对象,但只有一个坐标轴是当前坐标轴,在没有指明坐标轴时,所有的图形图像都是在当前坐标轴中输出。 必须弄清一个概念,所谓在某个图形窗口中输出图形图像,实质上是指在该图形窗口的当前坐标轴中输出图形图像。 建立坐标轴对象使用 axes
函数,其调用格式如下:
句柄变量= axes ( 属性名1 , 属性值1 , 属性名2 , 属性值2 , . . . )
调用 axes
函数用指定的属性在当前图形窗口创建坐标轴,并将其句柄赋给左边的句柄变量。也可以使用 axes
函数按 MATLAB 默认的属性值在当前图形窗口创建坐标轴,其调用格式如下:
axes
句柄变量= axes
用 axes
函数建立坐标轴之后,还可以调用 axes
函数将之设定为当前坐标轴,且坐标轴所在的图形窗口自动成为当前图形窗口,调用格式如下:
axes ( 坐标轴句柄)
这里需要注意的是,这里引用的坐标轴句柄必须存在,这与 figure
函数的对应调用形式不同。 MATLAB 为每个坐标轴对象提供了很多属性。除公共属性外,其他常用属性如下。 (1) Box 属性:该属性的取值是 ‘on’ 或 ‘of’(默认值),它决定坐标轴是否带有边框。 (2) GridLineStyle 属性:该属性的取值可以是 ‘:’(默认值)、‘-’、‘-.’、‘–’ 或 ‘none’,用于定义网格线的类型。 (3) Position 属性:该属性的取值是一个由 4 个元素构成的向量,其形式为 [x,y,w,h]。这个向量在图形窗口中决定一个矩形区域,坐标轴就位于其中。该矩形的左下角相对于图形窗口左下角的坐标为 (x,y),矩形的宽和高分别 w 和 h。它们的单位由 Units 属性决定。 (4) Units 属性:该属性的取值是 ‘normalized’(相对单位,为默认值)、‘inches’(英寸)、‘centimeters’(厘米)和 ‘points’(磅),用于定义 Position 属性的度量单位。 (5) Title 属性:该属性的取值是坐标轴标题文字对象的句柄,可以通过该属性对坐标轴标题文字对象进行操作。 例如,要改变标题的颜色,可执行以下命令:
>> h= get ( gca, 'Title' ) ; % 获得标题文字对象句柄
>> set ( h, 'Color' , 'r' ) ; % 设置标题颜色
(6) ColorOrder 属性:用于设置多条曲线的颜色顺序,其值是元素为 RGB 值的
n
×
3
n×3
n × 3 矩阵,每行代表用 RGB 三元组表示的一种颜色,默认有 7 种颜色。以下命令显示了当前坐标轴的默认颜色顺序。
>> get ( gca, 'ColorOrder' )
ans =
0 0.4470 0.7410
0.8500 0.3250 0.0980
0.9290 0.6940 0.1250
0.4940 0.1840 0.5560
0.4660 0.6740 0.1880
0.3010 0.7450 0.9330
0.6350 0.0780 0.1840
(7) XLabel、YLabel、ZLabel 属性:3 种属性的取值分别是 x、y、z 轴说明文字的句柄。其操作与 Title 属性相同。例如,要设置 x 轴文字说明,可使用以下命令:
>> h= get ( gca, 'XLabel' ) ; % 获得 x 轴文字对象句柄.
>> set ( h, 'String' , 'Values of X axis' ) ; % 设置 x 轴文字说明
(8) XLim、YLim、ZLim 属性:3 种属性的取值都是具有两个元素的数值向量,分别定义各坐标轴的上下限,默认值为 [0, 1]。 (9) XScale、YScale、 ZScale 属性:3 种属性的取值都是 ‘linear’(默认值)或 ‘log’,用于定义各坐标轴的刻度类型。 (10) View 属性:该属性的取值是 2 元素数值向量,定义视点方向。 例如,我们利用坐标轴对象 实现图形窗口的任意分割。 利用 axes
函数可以在不影响图形窗口上其他坐标轴的前提下建立一个新的坐标轴,从而实现图形窗口的任意分割。 程序如下:
clf; % 清图形窗口
x= linspace ( 0 , 2 * pi, 20 ) ;
y= sin ( x) ;
axes ( 'Position' , [ 0.2 , 0.2 , 0.2 , 0.7 ] , 'GridLineStyle' , '-.' ) ;
plot ( y, x) ;
title ( 'sin(x)-1' ) ;
axes ( 'Position' , [ 0.4 , 0.5 , 0.2 , 0.1 ] ) ;
stairs ( x, y) ;
title ( 'sin(x)-2' ) ;
axes ( 'Position' , [ 0.55 , 0.6 , 0.25 , 0.3 ] ) ;
stem ( x, y) ; title ( 'sin(x)-3' ) ;
axes ( 'Position' , [ 0.55 , 0.2 , 0.25 , 0.3 ] ) ;
[ x, y] = meshgrid ( - 8 : 0.5 : 8 ) ;
z= sin ( sqrt ( x. ^ 2 + y. ^ 2 ) ) . / sqrt ( x. ^ 2 + y. ^ 2 + eps) ;
mesh ( x, y, z) ; title ( 'mesh(x,y,z)' ) ;