MATLAB系列09:图形句柄
- 9. 图形句柄
- 9.1 MATLAB图形系统
- 9.2 对象句柄
- 9.3 对象属性的检测和更改
- 9.3.1 在创建对象时改变对象的属性
- 9.3.2 对象创建后改变对象的属性
- 9.4 用 set 函数列出可能属性值
- 9.5 自定义数据
- 9.6 对象查找
- 9.7 用鼠标选择对象
- 9.8 位置和单位
- 9.8.1 图像(figure)对象的位置
- 9.8.2 坐标系对象和 uicontrol 对象的位置
- 9.8.3 文本(text)对象的位置
- 9.9 打印位置
- 9.10 默认和 factory 属性
9. 图形句柄
9.1 MATLAB图形系统
MATLAB 图形系统是建立在图形对象的等级系统之上, 每一个图形对象都有一个独立的名字, 这个名字叫做句柄。 每一个图形对象都有它的属性, 我们可以通过修改它的属性来修改物体的行为。 例如, 一条曲线是图形对象的一种。 曲线对象有以下的属性: x 数据, y 数据, 颜色, 线的类型, 线宽, 符号类型等等。 修改其中的一个属性就会改变图象窗口中的一个图像。
图形对象的层次结构如下:
在 MATLAB 中最高层次的图形对象被称为根对象, 我们可以通过它对整个计算机屏幕进行控制。 当 MATLAB 启动时, 根对象会被自动创建, 它一直存在直到 MATLAB 被关闭。与根对象相关的属性是应用于所用 MATLAB 窗口的默认属性。
在根对象下, 有多个图像窗口, 或只有图像。 每一个图像在用于显示图像数据的计算机屏幕上都有一个独立的窗口, 每一个图像都有它独立的属性。 与图像相关的属性有, 颜色,图片底色, 纸张大小, 纸张排列方向, 指针类型等。
9.2 对象句柄
句柄是在 MATLAB 中的一个独一无二的整数或实数, 用于指定对象的身份。 用于创建一个图象对象的任意命令都会自动地返回一个句柄。示例:
>> Handl=figureHandl = Figure (1) - 属性:Number: 1Name: ''Color: [0.9400 0.9400 0.9400]Position: [573 444 560 420]Units: 'pixels'显示 所有属性
图像(图)对象的句柄一般是一个小的正整数, 例如 1, 2, 3……而其他的图形(graphic)对象为任意的浮点数。我们可以利用 MATLAB 函数得到图像, 坐标系和其他对象的句柄。 例如, 函数 gcf 返回当前图像窗口的句柄, 而函数 gca 则返回在当前图像窗口中的当前坐标系对象的句柄, 函数gco 返回当前选择对象的句柄。 为了方便, 存储句柄的变量名要在小写字母后面个H。 这样就可以与普通变量(所有的小写变量, 大写变量, 全局变量)区分开来。
9.3 对象属性的检测和更改
9.3.1 在创建对象时改变对象的属性
当一个对象被创建时, 所有的属性都会自动初始化为默认值。 包含有"propertyname(属性名)"的创建函数创建对象时, 默认值会被跳过, 而跳过的值在创建函数中有。
plot(x, y, 'LineWidth', 2);
9.3.2 对象创建后改变对象的属性
我们可以用随时用 get 函数检测任意一个对象的属性, 并用 set 函数对它进行修改。
示例:
>> x = 0:0.1:2;
y = x .^2;
Hnd1 = plot(x, y);
>> result=get(Hnd1)result = 包含以下字段的 struct:XData: [0 0.1000 0.2000 0.3000 0.4000 0.5000 0.6000 0.7000 0.8000 0.9000 1 … ] (1×21 double)XDataMode: 'manual'XVariable: ''YData: [0 0.0100 0.0400 0.0900 0.1600 0.2500 0.3600 0.4900 0.6400 0.8100 1 … ] (1×21 double)YDataMode: 'manual'YVariable: ''ZData: [1×0 double]ZDataMode: 'auto'ZVariable: ''XDataSource: ''YDataSource: ''ZDataSource: ''Color: [0 0.4470 0.7410]ColorMode: 'auto'LineStyle: '-'LineStyleMode: 'auto'LineWidth: 0.5000Marker: 'none'MarkerMode: 'auto'MarkerSize: 6MarkerEdgeColor: 'auto'MarkerFaceColor: 'none'Clipping: onMarkerIndices: [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21]AlignVertexCenters: offLineJoin: 'round'Children: [0×0 GraphicsPlaceholder]Parent: [1×1 Axes]Visible: onHandleVisibility: 'on'ButtonDownFcn: ''ContextMenu: [0×0 GraphicsPlaceholder]BusyAction: 'queue'BeingDeleted: offInterruptible: onCreateFcn: ''DeleteFcn: ''Type: 'line'Tag: ''UserData: []Selected: offSelectionHighlight: onHitTest: onPickableParts: 'visible'DisplayName: ''Annotation: [1×1 matlab.graphics.eventdata.Annotation]SeriesIndex: 1DataTipTemplate: [1×1 matlab.graphics.datatip.DataTipTemplate]SourceTable: [0×0 table]AffectAutoLimits: on
得到的图像:
更改线宽:
>> set(Hnd1,'LineWidth',4,'LineStyle','--')
我们还可以使用属性编辑器来改变图像属性,启动命令为:
propedit(HandleList);
propedit;
这个函数第一个形式用于编辑所列出的句柄的属性, 而这个函数的第二种形式用于编辑当前图象的属性。
9.4 用 set 函数列出可能属性值
函数用于提供所有可能的属性值列表。 如果在调用函数 set 时, 只包括属性名而不包括相应的属性值, 那么函数 set 就会返回所有的合法属性值。
>> set(Hnd1,'LineStyle')5×1 cell 数组{'-' }{'--' }{':' }{'-.' }{'none'}
函数 set(Hnd1)返回一个对象的所有属性的所有可能的属性值。
>> set(Hnd1)AffectAutoLimits: {[on] [off]}AlignVertexCenters: {[on] [off]}BusyAction: {'queue' 'cancel'}ButtonDownFcn: {}Children: {}Clipping: {[on] [off]}Color: {1×0 cell}ColorMode: {'auto' 'manual'}ContextMenu: {}CreateFcn: {}DeleteFcn: {}DisplayName: {}HandleVisibility: {'on' 'callback' 'off'}HitTest: {[on] [off]}Interruptible: {[on] [off]}LineJoin: {'chamfer' 'miter' 'round'}LineStyle: {'-' '--' ':' '-.' 'none'}LineStyleMode: {'auto' 'manual'}LineWidth: {}Marker: {1×16 cell}MarkerEdgeColor: {'auto' 'none'}MarkerFaceColor: {'auto' 'none'}MarkerIndices: {}MarkerMode: {'auto' 'manual'}MarkerSize: {}Parent: {}PickableParts: {'visible' 'none' 'all'}Selected: {[on] [off]}SelectionHighlight: {[on] [off]}SeriesIndex: {'none'}SourceTable: {}Tag: {}UserData: {}Visible: {[on] [off]}XData: {}XDataMode: {'auto' 'manual'}XDataSource: {}XVariable: {}YData: {}YDataMode: {'auto' 'manual'}YDataSource: {}YVariable: {}ZData: {}ZDataMode: {'auto' 'manual'}ZDataSource: {}ZVariable: {}
9.5 自定义数据
除了一个 GUI 对象定义的标准属性以外, 程序可以定义所要控制的数据的特殊属性。程序员可以用附加属性把任意类型的数据添加到 GUI 对象中。 任意数量的数据可以被存储,并应用于各种目的。自定义数据可以用近似标准属性的形式存储。 每一个数据条目都有一个名字和值。 数据变量可以用函数 setappdate 存储在一个对象, 并用函数 getappdata 接收。setappdate 函数的基本形式如下
setappdata(Hndl, 'DataName', DataValue);
与自定义数据相关的函数:
9.6 对象查找
每一个新的图象在从创建开始时就有它们自已的句柄, 句柄可以由创建函数返回。假设我们由于一些原因, 丢失了对象的句柄。 我们如何检测和图形对象呢?MATLAB 提供了四个专门的函数, 用来帮助寻找对象的句柄。
gcf
返回当前图象的句柄gca
返回当前图象中当前坐标系的句柄gco
返回当前对象的句柄findobj
寻找指定属性值的图形对象
函数 gcf 返回当前图象的句柄。 如果这个图象不存在, gcf 将会创建一个, 并返回它的句柄。 函数 gca 返回当前图象中当前坐标系的句柄, 如果图象不存在, 或当前图象中无坐标系, 那么函数 gca 将创建一个坐标系, 并返回它的句柄。
当前对象是指用鼠标单击的最后一个对象。 这个对象可以是除了根对象的任意图形对象。直到鼠标在图象内发生了单击事件, 在图象内才有一个当前对象。 在单击事件发生之后, 函数 gco 将返回一个空数组[], 不像函数 gcf 和 gca, gco 如果不存在就自动创建。
9.7 用鼠标选择对象
函数 gco 将返回当前对象, 当前对象是指用鼠标最后一次单击的对象。 每一个对象都有一个与之相关的可选择区, 在可选择区内任意一个单击都可以看作对这个对象的单击。 对于细小的对象(例如线, 点)来说, 这种特性是非常重要的。 可选择区的宽度和形状由对象的类型确定。
如果一个用户单击了两个或多个对象的所在点, 例如两线的交插点将会有什么事情发生。 这取决于每一个对象堆垛顺序(stacking order)。 堆垛顺序是 MATLAB 选择对象的顺序。 在一个图象中所有的"子对象"属性句柄顺序就是堆垛顺序。 如果单击了两个或多个对象的所在点, 在堆垛顺序的优先权高的将会被选择。
当选择图形对象时, 我们有时可以调用 MATLAB 内建函数 waitforbuttonpress。 这个函数的形式为
k = waitforbuttonpress
当这个函数运行时, 它将会暂停程序, 直到任意键按下或鼠标单击事件发生后, 程序才恢复运行。 如果按下了鼠标键函数将会返回 0, 按下任意键, 函数将会 1。函数经常用于暂停程序。 当鼠标单击事件发生后, 程序将会用 gco 函数恢复选择对象的句柄。
9.8 位置和单位
9.8.1 图像(figure)对象的位置
一个图象(图)的位置(“position”)用一个 4 元素行向量指定在计算机屏幕内的位置。 在这个向量中的值为[left bottom width height], 其中 left 是指图象的左边界, bottom 是指图象的底边界, width 是指图象的宽度, height 是指图象的高度。 它的这些位置值的单位可以用对象的"Units"属性指定。 例如, 与当前图象的位置和单位可以用下面的语句得到。
>> get(gcf,'Position')ans =573.0000 443.6667 560.0000 420.0000>> get(gcf,'Units')ans ='pixels'
单位(“units”)属性的默认值为像素(pixels), 但是它的属性值还可以为英尺(inches), 公分(centimeters), 点(points), 或归一化坐标(normalixed coordinates)。 像素代表了屏幕像素,即在屏幕上可表示出来的最小的对象。因为像素数因机算机屏幕的不同而不同, 所以指定对象的大小也会随之改变。归一化坐标是在 0 到 1 范围内。在归一化坐标中,屏幕的左下角为[0, 0]右上角为[1.0, 1.0]。
如果对象的位置归一化坐标系的形式描述, 那么不同分辨率的显示器上对象的相对位置是固定的。 例如, 下面的语句创建了一个图象, 把图象放置在屏幕的上部, 而不用考虑显示器的大小。
H = figure(1)
set(H,'units', 'normalized','position',[0 .5 .5 .45])
9.8.2 坐标系对象和 uicontrol 对象的位置
坐标系对象和 uicontrol 对象的位置同样可以用一个 4 元素向量表示, 但它是相对于figure 对象的位置。 一般说来, 所有子对象的"position"属性都与它的父对象相关。默认地, 坐标系对象在一图象内的位置是有归一化单位指定的, (0, 0)代表图象的左下角, (1, 1)代表图象的右上角。
9.8.3 文本(text)对象的位置
与其他对象不同, 文本(text)对象有一个位置属性, 包含两个或三个元素。 这些元素为坐标系对象中文本对象的 x, y 和 z 轴。 注意都显示在坐标轴上。放置在某一特定点的文本对象的位置可由这个对象的 HorizontalAlignment 和VerticalAlignment 属性控制HorizontalAlignment 的属性可以是{Left}。 Center, 或 Right。VerticalAlignment 的属性值可以为 Top, cap, {Middle}, Baseline 或 Bottom。文本对象的大小由字体大小和字符数决定, 所以没有高度和宽度值与之相连。
9.9 打印位置
属性"Position"和"Units"用来指定图象在计算机屏幕上的位置。 还有其他的五个属性用于指定图象在打印纸上的位置。
9.10 默认和 factory 属性
MATLAB 允许你修改默认值本身,所以当他们被创建时, 所有的对象都会继承所有正确的属性值。默认值的设置要用一个字符串, 这个字符串由"Default", 对象类型和属性名组成。 所以默认图象颜色可以通过属性"DefaultFigureColor"来设置, 默认的坐标轴颜色可以通过属性"DefaultAxesColor"设置。 下面是设置默认值的一些例子:
如果你想要定制 MATLAB, 每一次都有不同的默认值, 那么每次当 MATLAB 启动时你必须对根对象设置默认值。 最简单的方法是把默认值存入 startup.m 文件, 每次 MATLAB 启动时都会自动执行。 例如, 假设你经常使用 A4 纸, 并在图象中经常加入网格线。 那么你可以把下面的语句加入到 startup.m 文件中。
set(0, 'DefaultFigurePaperType', 'a4letter');
set(0, 'DefaultAxesXGrid', 'on');
set(0, 'DefaultAxesYGrid', 'on');
set(0, 'DefaultAxesZGrid', 'on');
有三种特殊值字符串用于句柄图形:“remove”, “factory"和"default”。 如果你已经为一个属性设置了默认值, 那么"remove"值将会删除你所设置的默认值。 例如, 假设你设置默认的图象颜色为黄色。
set(0, 'DefaultFigureColor', 'y');
调用下面的函数将会取消当前的默认值并恢复先前的默认值。
set(0, 'DefaultFigureColor', 'remove');
字符串"factory"允许临时跳过当前的默认值, 并使用原来的 MATLAB 的默认值。
figure('Color', 'factory');