9.3 句柄图形
9.3.1 获取句柄
9.3.2 图形对象属性以及如何更改它们
通过对象的句柄改变它的属性
属性名称对大小写的不敏感性
图形对象的类型的属性
MATLAB的图形功能之所以丰富而强大,是因为它的Handle Graphics对象的支持。在MATLAB的在线文档"MATLAB帮助:图形"中有一个非常有用的部分专门介绍了Handle Graphics对象。接下来是对其主要特点的简要总结。Handle Graphics是MATLAB中一种机制,用于创建和操作图形对象。图形对象可以是图形窗口、坐标轴、曲线、文字等等。每个图形对象都有一个唯一的句柄(handle),通过该句柄可以对对象进行操作和修改属性。
重要概念包括:
图形窗口(Figure):图形窗口是图形的最高级别容器,可以包含多个子对象,如坐标轴、图例和标签。
坐标轴(Axes):坐标轴用于绘制图形和设置图形的属性,可以设置坐标轴的范围、刻度、标签等。
图形对象(Graphics Objects):图形对象可以是曲线、散点图、图像、文字等,每个图形对象有自己的属性,可以通过设置属性来控制显示效果。
句柄(Handle):句柄是每个图形对象的唯一标识,通过句柄可以引用和操作对象。
使用Handle Graphics可以实现如下功能:
创建和修改图形对象:可以使用函数创建各种类型的图形对象,并通过设置属性来修改其外观和行为。
控制图形的显示:可以设置图形窗口和坐标轴的属性,修改背景、边框等样式,以及调整图形的位置和大小。
添加和删除图形对象:可以在图形窗口或坐标轴中添加新的图形对象,也可以删除现有的对象。
交互操作:可以通过鼠标和键盘与图形进行交互,包括缩放、平移、旋转等操作。
处理图形对象是MATLAB图形中使用的基本元素。这些对象按照父子继承结构排列,如图所示。
例如,线条(Line)和文本(Text)对象是坐标轴(Axes)对象的子对象。这可能是最常见的父子关系。坐标轴对象定义在图形窗口中的一个区域,并将它们的子对象放置在这个区域内。坐标轴对象中的实际绘图是线条对象(Line)。轴标签和任何文本注释都是文本对象(Text)。当您希望使用句柄(handle)来操作图形对象时,了解这个父子层次结构非常重要。
图形对象的句柄(handle)是什么?每当MATLAB创建一个图形对象时,它会自动创建一个句柄(handle)指向该对象。您可以使用一个显式返回图形对象句柄的函数来获取对象的句柄,或者在绘制图形对象时显式创建句柄。句柄本身具有浮点表示,但其实际值不需要关注。更重要的是保存其名称,然后使用句柄来更改或操作图形对象。通过使用句柄,您可以在程序中引用和操作图形对象,而不需要直接访问对象本身。这种间接的方式使得在MATLAB中处理图形对象更加灵活和方便。
根对象是唯一句柄为0的对象。只有一个根对象,由MATLAB在启动时创建。所有其他对象都是它的后代,如上图所示。
9.3.1 获取句柄
绘制图形对象的函数也可以用来返回所绘制对象的句柄,例如:
x = 0:pi/20:2*pi;
hsin = plot(x, sin(x))
hold on
hx = xlabel('x')
hsin是当前坐标轴(Axes)对象中线条对象(Line)(正弦曲线图)的句柄(handle),而hx是当前坐标轴对象中文本对象(Text)(x轴标签)的句柄(handle)。
通过这些句柄,您可以引用特定的图形对象并对其进行操作。例如,您可以使用hsin来更改线条对象的属性,如线宽、颜色或样式。同样地,您可以使用hx来更改文本对象的属性,如文本内容、字体、字号或位置。另外,这些句柄还可以用于将新的属性值应用于图形对象,以及添加响应事件或其他操作。通过使用这些句柄来访问和操作特定的对象,您可以对图形进行自定义和交互式的修改。
命令 figure(h)
其中 h 是一个整数,可以创建一个新的图形,或者使图形 h 成为当前图形。h 是图形对象的句柄。
有三个函数返回特定图形对象的句柄:
gcf
gets the handle of the current figure
gcf
(Get Current Figure)是一个内置函数,用于获取当前打开的图形窗口的句柄。gcf
函数的语法如下:
fig = gcf
其中,fig
是一个变量,用于存储当前图形窗口的句柄。当调用gcf函数时,它会返回当前活动图形窗口的句柄,并将其赋值给变量fig
。你可以将该句柄存储在变量中,以便之后对图形窗口进行进一步操作,如修改属性、添加绘图元素、保存图形等。
示例:
plot(x, y) % 创建一个图形窗口并绘制图形
fig = gcf; % 获取当前图形窗口的句柄
在这个示例中,首先通过plot
函数创建一个图形窗口并绘制一条曲线。然后,使用gcf
函数获取当前图形窗口的句柄,并将其存储在变量fig
中。
gca
gets the handle of the current axes
gca
用于获取当前图形窗口中活动的坐标轴的句柄。gca
函数的语法如下:
ax = gca
其中,ax
是一个变量,用于存储当前活动的坐标轴的句柄。当调用gca
函数时,它会返回当前活动图形窗口中的坐标轴的句柄,并将其赋值给变量ax
。你可以将该句柄存储在变量中,以便之后对坐标轴进行进一步的操作,如修改坐标轴范围、添加标签、设置刻度等。
plot(x, y) % 创建一个图形窗口并绘制图形
ax = gca; % 获取当前图形窗口中的坐标轴句柄
在这个示例中,首先通过plot
函数创建一个图形窗口并绘制一条曲线。然后,使用gca
函数获取当前图形窗口中活动的坐标轴的句柄,并将其存储在变量ax
中。你可以使用这个句柄来修改坐标轴的属性,增加注释,设置刻度等。
gco
gets the handle of the current graphics object
获取当前图形对象的句柄,该对象是最后创建或单击的图形对象。例如,绘制上面的正弦图并获取其句柄 hsin
. 单击图形窗口中的图形。然后在命令窗口中输入命令ho = gco
. ho
应该设置为正弦图的句柄(它应该具有与 hsin
相同的数值)。
9.3.2 图形对象属性以及如何更改它们
一旦你有了一个图形对象的句柄,你就可以用它来改变这个对象的属性。看一个例子,画一个正弦图并得到它的句柄,如上所示:
x = 0:pi/20:2*pi;
hsin = plot(x, sin(x))
现在假设你想让图更粗一些。输入如下命令:
set(hsin, 'linewidth', 4);
你会得到一条漂亮的正弦曲线!
linewidth
是我们图形对象的众多属性之一。要查看对象的所有属性名称及其当前值,请使用get(h)
,其中h
是对象的句柄。(这里的对象句柄就是 hsin)
通过调用get(h)
函数,你可以获取图形对象的所有属性名称和它们的当前值。该函数将返回一个包含属性名称和对应值的结构体或者一个类似于键值对的列表。你可以使用这些属性名称来获得和修改图形对象的各个属性的值。
hsin =
Line - 属性:
Color: [0 0.4470 0.7410]
LineStyle: '-'
LineWidth: 0.5000
Marker: 'none'
MarkerSize: 6
MarkerFaceColor: 'none'
XData: [0 0.1571 0.3142 0.4712 0.6283 0.7854 0.9425 … ]
YData: [0 0.1564 0.3090 0.4540 0.5878 0.7071 0.8090 … ]
ZData: [1×0 double]
>> get(hsin)
AlignVertexCenters: off
Annotation: [1×1 matlab.graphics.eventdata.Annotation]
BeingDeleted: off
BusyAction: 'queue'
ButtonDownFcn: ''
Children: [0×0 GraphicsPlaceholder]
Clipping: on
Color: [0 0.4470 0.7410]
ColorMode: 'auto'
ContextMenu: [0×0 GraphicsPlaceholder]
CreateFcn: ''
DataTipTemplate: [1×1 matlab.graphics.datatip.DataTipTemplate]
DeleteFcn: ''
DisplayName: ''
HandleVisibility: 'on'
HitTest: on
Interruptible: on
LineJoin: 'round'
LineStyle: '-'
LineStyleMode: 'auto'
LineWidth: 0.5000
Marker: 'none'
MarkerEdgeColor: 'auto'
MarkerFaceColor: 'none'
MarkerIndices: [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 … ]
MarkerMode: 'auto'
MarkerSize: 6
Parent: [1×1 Axes]
PickableParts: 'visible'
Selected: off
SelectionHighlight: on
SeriesIndex: 1
Tag: ''
Type: 'line'
UserData: []
Visible: on
XData: [0 0.1571 0.3142 0.4712 0.6283 0.7854 … ]
XDataMode: 'manual'
XDataSource: ''
YData: [0 0.1564 0.3090 0.4540 0.5878 0.7071 … ]
YDataSource: ''
ZData: [1×0 double]
ZDataSource: ''
你可以使用set函数来更改任何属性的值:
set(handle, 'PropertyName', PropertyValue)
其中,handle表示对象的句柄,PropertyName表示要更改的属性名称,PropertyValue则是你希望将该属性更改为的新值。
通过调用set函数,你可以修改图形对象的特定属性的值。通过提供对象的句柄、属性名称和期望的新值,你可以精确地更改对象的特定属性。这种灵活性使得你能够自定义和调整图形对象的各个属性,以满足你的需求。
举例来说,如果你有一个句柄为handle的图形对象,并且你想将它的线宽属性(linewidth)的值更改为2,你可以使用以下代码进行操作:
set(handle, 'linewidth', 2)
这会将指定图形对象的线宽更改为2。你可以根据需要使用set函数来修改其他属性值,以实现你想要的效果。
通过对象的句柄改变它的属性
你可以获得一个对象的句柄并同时改变它的属性。例如,set(gcf, 'visible', 'off')
要使当前图形不可见(但不关闭它,即仍然存在),你可以使用以下代码:
set(gcf, 'visible', 'off')
其中,gcf表示获取当前图形的句柄。通过设置'visible'属性为'off',你可以将当前图形设置为不可见状态。
如果你希望将图形重新设置为可见状态,可以使用以下代码:
set(gcf, 'visible', 'on')
通过设置'visible'属性为'on',你可以使当前图形重新可见。
属性名称对大小写的不敏感性
属性名称对大小写不敏感,并且你可以将它们缩写为足够独特的几个字母。例如,你可以将type属性缩写为ty。
>> get(hsin,'ty')
ans =
'line'
当使用set函数或get函数时,你可以使用缩写形式的属性名称来访问和修改对象的属性。只要缩写形式足够独特,可以避免与其他属性名称冲突,就可以使用缩写形式。
举例来说,如果你想访问或修改一个名为'linestyle'的属性,你可以使用下面的代码:
set(handle, 'linest', 'dotted')
在这里,我们使用了'linest'作为'linestyle'属性的缩写形式,并将其设置为'dotted'。
需要注意的是,虽然你可以使用属性名称的任意缩写形式,但最好选择具有一定可读性和易于理解的缩写方式,以确保代码的可维护性和可读性。
图形对象的类型的属性
不同类型的图形对象并不具有完全相同的属性集,尽管某些属性是所有图形对象共有的,例如children、parent、type等。
每种图形对象都可以具有特定于其类型的属性,以控制其外观、位置和行为。例如,线条对象可能具有线宽(linewidth)和线型(linestyle)属性,而文本对象可能具有字体(font)、字号(fontsize)和内容(string)属性。
然而,有几个属性是所有图形对象共有的,它们包括:
- children:表示该图形对象的子对象,即与该图形对象相关联的其他图形对象。
- parent:表示该图形对象的父对象,即包含该图形对象的图形容器对象。
- type:表示图形对象的类型,例如line、text、rectangle等。
这些共有属性对于图形对象的组织和管理非常有用。通过children属性,你可以查找和操作与特定图形对象相关联的其他对象。通过parent属性,你可以确定图形对象所属的图形容器。通过type属性,你可以确定图形对象的具体类型,从而分辨它是线条、文本还是其他类型的图形对象。