目录
11.3.2 高频应用的图形句柄函数:gcf、gca、get 和 set
gcf - Get Current Figure (获取当前窗口句柄)
gca - Get Current Axes (获取当前坐标轴句柄)
层次结构(Parent-Child Relationship)
11.3灵活强大的图形对象句柄
11.3.1 从简单的示例引出图形对象句柄
场景一:简单的绘图
先从最基本的绘图命令开始。假设想画一个正弦波:
x = 0:0.1:2*pi;
y = sin(x);
plot(x, y);
执行这行代码,MATLAB会弹出一个窗口,里面有一条蓝色的曲线。
现在,加点东西,比如给这条线加上标签:
xlabel('X轴');
ylabel('Y轴');
title('正弦函数图像');
grid on;
会发现,xlabel, ylabel, title 这些命令“知道”要操作的是刚才那个窗口和那条曲线。
这背后,MATLAB其实是在操作一个“当前”的图形对象。
这种方式很方便,但问题来了:如果我有多个图呢?
场景二:多个图形的“混乱”
假设想在一个窗口里画两条线,一条正弦,一条余弦。
x = 0:0.1:2*pi;
y1 = sin(x);
y2 = cos(x);
plot(x, y1); % 画第一条线
hold on; % 保持当前图形,准备叠加
plot(x, y2); % 画第二条线
hold off; % 解除保持
legend('sin(x)', 'cos(x)'); % 添加图例
这看起来也没问题。
但如果我想把第二条线(余弦线)变成红色,并且线宽加粗呢?
可能会想,有没有一个命令叫 changethesecondline?
当然没有。
这时,就需要一个更精确、更强大的工具来“指名道姓”地操作想要的任何一个图形元素。
这个工具,就是“句柄”(Handle)。
核心概念:图形句柄
把MATLAB的图形想象成一棵“家族树”:
- 最顶层是 Figure(整个窗口)。
- Figure里面可以有 Axes(坐标系)。
- Axes里面有各种 Line(线条)、Text(文字)、Patch(色块)等。
在MATLAB中,创建的每一个图形元素(窗口、坐标轴、线条、文本等)都是一个对象。
句柄(Handle) 就是访问这些对象的唯一标识符,可以把它想象成一个“遥控器”。
只要拿到了这个“遥控器”,就可以随时随地读取或修改该对象的任何属性(如颜色、大小、位置、数据等),而不需要重新绘制整个图形。
场景三:获取并使用句柄
回到刚才的正弦余弦图,用一种更专业的方式来画:
x = 0:0.1:2*pi;
y1 = sin(x);
y2 = cos(x);
% 1. 创建一个Figure窗口,并把它的句柄存到变量 fig 中
fig = figure;
% 2. 在这个窗口里创建坐标系,把句柄存到 ax 中
ax = axes;
% 3. 在这个坐标系里画第一条线,并把线的句柄存到 h1 中
h1 = plot(x, y1, 'b-', 'LineWidth', 2);
% 4. 画第二条线,并把句柄存到 h2 中
h2 = plot(x, y2, 'k--');
现在,有了三个“遥控器”:fig (窗口)、ax (坐标系)、h1 和 h2 (两条线)。
现在,实现刚才的需求:把余弦线变红、加粗,就变得异常简单:
% 使用 h2 这个“遥控器”来修改第二条线的属性
set(h2, 'Color', 'red', 'LineWidth', 3);
看,直接对 h2 进行操作,完全不会影响到 h1。
这就是句柄的威力:精确控制。
还可以用 get 命令查看一个对象的所有属性:
% 查看第一条线的所有当前属性和属性值
get(h1)
会看到它的颜色、线型、数据源等所有信息。
场景四:更复杂的操作
句柄的用处远不止修改颜色。比如,想在程序运行一段时间后,动态更新曲线上的数据点。
% 假设要更新 h1 这条线的数据
new_y_data = sin(x + pi/4); % 新的数据
% 直接通过句柄修改它的 YData 属性
set(h1, 'YData', new_y_data);
或者,想获取坐标系的范围,然后根据这个范围来添加一些标注:
% 获取坐标系的 X 和 Y 轴范围
x_lim = get(ax, 'XLim');
y_lim = get(ax, 'YLim');
% 在图的右上角添加文本
text(x_lim(2)*0.8, y_lim(2)*0.9, '相位移动', 'Parent', ax);
注意这里 'Parent', ax 的用法,它明确告诉 text 函数,要把这个文本放到 ax 这个坐标系里。
11.3.2 高频应用的图形句柄函数:gcf、gca、get 和 set
| 函数 | 全称 | 功能 | 常用语法 | 示例 |
| gcf | Get Current Figure | 获取当前窗口的句柄 | h = gcf | set(gcf, 'Name', 'Results'); |
| gca | Get Current Axes | 获取当前坐标轴的句柄 | h = gca | set(gca, 'FontSize', 14); |
| get | Get | 获取对象的属性值 | v = get(h, 'Color') | current_xlim = get(gca, 'XLim'); |
| set | Set | 设置对象的属性值 | set(h, 'Color', 'r') | set(plot_handle, 'LineWidth', 2); |
gcf - Get Current Figure (获取当前窗口句柄)
功能
返回当前Figure窗口的句柄。
“当前窗口”通常指最后被点击、创建或绘图的窗口。
语法
h = gcf
参数说明
无输入参数。
返回值
h 是一个包含当前窗口句柄的变量。
使用举例
% 先创建一个图形
plot(1:10);
% 获取当前窗口的句柄
fig_handle = gcf;
% 使用句柄修改窗口属性
set(fig_handle, 'Name', '我的数据图', 'Color', [0.9 0.9 0.9]); % 设置窗口标题和背景色
gca - Get Current Axes (获取当前坐标轴句柄)
功能
返回当前坐标轴(Axes)的句柄。
“当前坐标轴”是当前窗口中最后被创建或绘图的坐标系。
语法
h = gca
参数说明
无输入参数。
返回值
h 是一个包含当前坐标轴句柄的变量。
使用举例
% 绘制图形
x = linspace(0, 2*pi);
y = sin(x);
plot(x, y);
% 获取当前坐标轴的句柄
ax_handle = gca;
% 使用句柄修改坐标轴属性
set(ax_handle, 'XLim', [0, 2*pi]); % 设置X轴范围
set(ax_handle, 'XTick', 0:pi/2:2*pi); % 设置X轴刻度
set(ax_handle, 'FontSize', 12, 'GridLineStyle', '--'); % 设置字体大小和网格线样式
grid on;
get - 获取对象属性
功能
查询指定句柄所对应对象的某个或所有属性值。
语法
v = get(h) % 获取对象h的所有属性及其值
v = get(h, 'PropertyName') % 获取对象h的指定属性'PropertyName'的值
参数说明
h:图形对象的句柄。
'PropertyName':要查询的属性的名称(字符串,如 'Color', 'Position')。
返回值
v 是查询到的属性值。
使用举例
% 绘制一条线
h_line = plot(1:10, 'r-o');
% 1. 获取这条线的所有属性
all_properties = get(h_line); % all_properties将是一个结构体
% 2. 获取这条线的颜色属性
line_color = get(h_line, 'Color'); % 返回 [1 0 0],即红色
% 3. 获取当前坐标轴的X轴范围
x_range = get(gca, 'XLim'); % 返回 [1 10]
set - 设置对象属性
功能
设置指定句柄所对应对象的属性值。这是动态修改图形的核心函数。
语法
set(h, 'PropertyName1', PropertyValue1, 'PropertyName2', PropertyValue2, ...)
参数说明
h:图形对象的句柄。
'PropertyName':要设置的属性的名称。
PropertyValue:要为该属性设置的新值。
返回值
无
使用举例
% 绘制一条默认的蓝色细线
h_line = plot(1:10);
% 一次性设置多个属性
set(h_line, ...
'Color', [0 0.5 0.8], ... % 设置为自定义蓝色
'LineWidth', 3, ... % 设置线宽为3
'Marker', 's', ... % 设置数据点标记为方形
'MarkerSize', 8, ... % 设置标记大小
'MarkerFaceColor', 'y'); % 设置标记填充颜色为黄色
% 获取当前窗口句柄并设置其位置和大小 [left, bottom, width, height]
set(gcf, 'Position', [100, 100, 800, 600]);
知识扩展
层次结构(Parent-Child Relationship)
MATLAB的图形对象是分层的,理解这一点至关重要:
Figure (窗口) 是顶层容器。
Axes (坐标轴) 是 Figure 的子对象。
Line, Text, Surface 等是 Axes 的子对象。
可以通过 'Parent' 和 'Children' 属性来导航这个层次结构。
% 获取当前坐标轴的所有子对象(如线条、文本等)
all_lines_in_axes = get(gca, 'Children');
% 获取某条线的父对象(即它所在的坐标轴)
parent_axis = get(h_line, 'Parent');
findobj - 强大的对象搜索函数
当没有在创建时保存句柄,gca 和 gcf 又不够用时,findobj 是的救星。
它可以根据属性值在整个图形层次中查找对象。
语法
h = findobj('PropertyName', PropertyValue)
示例
% 在一个复杂的图中,找到所有颜色为红色的线条
plot(rand(5));
hold on;
plot(sin(linspace(0,2*pi)), 'r-', 'LineWidth', 2);
plot(cos(linspace(0,2*pi)), 'r--', 'LineWidth', 2);
red_lines = findobj(gcf, 'Type', 'line', 'Color', 'r');
% 现在把所有红色线条的线宽都改为5
set(red_lines, 'LineWidth', 5);
句柄属性的最佳实践
(1)显式获取优于隐式获取
在编写复杂的脚本或函数时,尽量在创建对象时就显式获取其句柄(如 h = plot(...)),而不是依赖 gca 或 gcf。这会让的代码更健壮、更可读,避免因用户交互(如点击其他窗口)导致的意外错误。
(2)批量设置属性
像 set 举例中那样,一次性设置多个属性,比多次调用 set 效率更高。
(3)利用函数句柄进行回调
在GUI设计中,句柄是实现交互(如按钮点击)的关键。可以将一个函数句柄赋值给图形对象的 'Callback' 属性。
11.3.3 为图形设置默认的属性
| 设置级别 | 语法 | 作用范围 | 示例 |
| 根级别 | set(0, 'Default...') | 全局:当前MATLAB会话中所有新创建的图形 | set(0, 'DefaultAxesFontSize', 14); |
| 窗口级别 | set(gcf, 'Default...') | 局部:仅在指定Figure窗口内新创建的对象 | set(gcf, 'DefaultLineLineWidth', 2); |
核心概念:为什么要设置默认属性?
在之前的实践中,可能经常写这样的代码:
plot(x, y1);
set(gca, 'FontSize', 12, 'LineWidth', 1.5, 'GridLineStyle', '--');
set(gcf, 'Color', 'w');
legend('Line 1');
set(findobj(gca, 'Type', 'line'), 'Color', 'b');
如果每个图都要这样设置,会非常繁琐且容易出错。
设置默认属性就是为了解决这个问题。
它允许“预设”一套规则,让MATLAB在创建新图形时自动应用这些规则,从而实现:
(1)效率提升:一次设置,处处生效。
(2)风格统一:确保所有图表(如报告、论文中的)风格一致。
(3)代码简洁:绘图代码更专注于数据本身,而非格式。
核心机制:default 属性前缀
MATLAB通过一个特殊的属性前缀 'Default' 来实现默认属性的设置。
语法
'Default<ObjectType><PropertyName>'
参数说明
Default:固定的前缀,告诉MATLAB这是一个默认属性设置。
<ObjectType>:要应用默认值的图形对象类型,如 Figure, Axes, Line, Text 等。首字母大写。
<PropertyName>:要设置的属性名称,如 Color, FontSize, LineWidth 等。首字母大写。
例如,'DefaultLineLineWidth' 就表示“所有新建线条的默认线宽”。
设置默认属性的方法与举例
设置默认属性主要有两种级别:根级别和图形窗口级别。
根级别设置(全局默认)
在根级别(即整个MATLAB会话)设置的默认属性对所有新创建的图形都有效,直到MATLAB关闭。
语法:
set(0, 'Default<ObjectType><PropertyName>', PropertyValue);
参数说明:
0:代表根对象的句柄。
'Default<ObjectType><PropertyName>':默认属性名。
PropertyValue:要设置的默认值。
使用举例:
% --- 在脚本开头或命令行窗口执行 ---
% 1. 设置所有新Figure窗口的默认背景色为白色
set(0, 'DefaultFigureColor', 'w');
% 2. 设置所有新坐标轴的默认字体大小为12
set(0, 'DefaultAxesFontSize', 12);
% 3. 设置所有新线条的默认线宽为1.5,颜色为深蓝色
set(0, 'DefaultLineLineWidth', 1.5);
set(0, 'DefaultLineColor', [0 0.2 0.5]);
% 4. 设置所有新文本对象(如标题、标签)的默认字体大小为14
set(0, 'DefaultTextFontSize', 14);
% --- 现在,开始绘图 ---
figure;
plot(1:10); % 这条线会自动是深蓝色,线宽1.5
title('我的标题'); % 标题字体大小自动为14
xlabel('X轴'); % X轴标签字体大小自动为14
ylabel('Y轴'); % Y轴标签字体大小自动为14
% 坐标轴上的刻度数字字体大小自动为12
注意:
根级别的设置是持久性的,会影响之后所有的图形。
通常建议在脚本或函数的开头进行设置,并在结束时恢复(见知识扩展)。
图形窗口级别设置(局部默认)
在特定Figure窗口上设置的默认属性,只对该窗口及其内部新创建的对象有效。
这非常适合为单个报告或应用创建统一的风格。
语法:
set(gcf, 'Default<ObjectType><PropertyName>', PropertyValue);
参数说明:
gcf:或任何Figure窗口的句柄。
其他参数同根级别设置。
使用举例:
% --- 创建一个Figure并为其设置专属默认值 ---
fig1 = figure;
% 只在这个窗口里,设置坐标轴的默认字体为Times New Roman
set(fig1, 'DefaultAxesFontName', 'Times New Roman');
set(fig1, 'DefaultAxesFontSize', 10);
% 只在这个窗口里,设置线条的默认线型为虚线
set(fig1, 'DefaultLineLineStyle', '--');
% 在fig1中绘图
subplot(2, 1, 1);
plot(1:10); % 这条线会是虚线
subplot(2, 1, 2);
plot(sin(linspace(0, 2*pi))); % 这条线也会是虚线
% --- 创建另一个Figure ---
fig2 = figure;
plot(1:5); % 在fig2中,线条是默认的实线,不受fig1设置的影响
扩展
查询和移除默认属性
(1)查询默认值:使用 get 函数。
% 查询根级别下线条的默认颜色
default_line_color = get(0, 'DefaultLineColor');
% 查询当前窗口下坐标轴的默认字体大小
default_ax_fontsize = get(gcf, 'DefaultAxesFontSize');
(2)移除默认值:将属性值设置为 'remove'。
% 移除根级别下线条颜色的默认设置,恢复为MATLAB出厂设置
set(0, 'DefaultLineColor', 'remove');
(3)临时覆盖默认值:在绘图函数中直接指定属性,会临时覆盖默认设置。
set(0, 'DefaultLineColor', 'r'); % 设置默认线条为红色
figure;
h1 = plot(1:5); % h1是红色
hold on;
h2 = plot(1:5, 'Color', 'b'); % h2是蓝色,覆盖了默认的红色
使用 struct 组织默认值
当默认属性很多时,可以使用结构体来组织代码,使其更清晰。
% 定义一个包含所有默认值的结构体
myDefaults.figureColor = 'w';
myDefaults.axesFontSize = 12;
myDefaults.axesFontName = 'Arial';
myDefaults.lineWidth = 1.5;
myDefaults.lineColor = [0.2 0.4 0.8];
% 应用这些默认值
set(0, 'DefaultFigureColor', myDefaults.figureColor);
set(0, 'DefaultAxesFontSize', myDefaults.axesFontSize);
set(0, 'DefaultAxesFontName', myDefaults.axesFontName);
set(0, 'DefaultLineLineWidth', myDefaults.lineWidth);
set(0, 'DefaultLineColor', myDefaults.lineColor);
% ... 绘图代码 ...
% 恢复默认设置(良好习惯)
set(0, 'DefaultFigureColor', 'remove');
set(0, 'DefaultAxesFontSize', 'remove');
set(0, 'DefaultAxesFontName', 'remove');
set(0, 'DefaultLineLineWidth', 'remove');
set(0, 'DefaultLineColor', 'remove');
结合 startup.m
如果希望每次启动MATLAB时都使用一套自己偏好的默认设置,可以将根级别的默认属性代码写入 startup.m 文件中。
这个文件会在MATLAB启动时自动运行。
可以在MATLAB的“预设”中找到该文件的位置,或直接在命令行输入 edit startup.m 来创建或编辑它。
11.3.4 delete 函数
| 操作目标 | 语法 | 说明 | 示例 |
| 单个对象 | delete(handle) | 删除句柄指定的单个对象 | delete(h_line); |
| 多个对象 | delete([h1, h2, ...]) | 删除句柄向量中的所有对象 | delete(text_handles); |
| 整个窗口 | delete(fig_handle) | 关闭句柄指定的Figure窗口 | delete(gcf); |
| 坐标轴内容 | delete(get(gca, 'Children')) | 清空当前坐标轴内的所有内容 | delete(allchild(gca)); |
核心概念:为什么需要手动删除图形对象?
在MATLAB中,当创建一个图形对象(如窗口、线条、坐标轴)时,它会在内存中占据空间。
虽然MATLAB有自己的垃圾回收机制,但在以下场景中,手动、精确地删除对象至关重要:
(1)动态图形更新:在制作动画时,通常需要在每一帧删除旧的图形对象(如移动的点、变化的曲线),然后绘制新的,以避免图形对象无限累积导致性能下降。
(2)内存管理:在生成了大量图形的长时间脚本或函数中,及时删除不再需要的Figure窗口可以释放大量内存。
(3)GUI开发:在图形用户界面(GUI)中,动态地添加和删除控件(如按钮、文本框)是实现交互逻辑的基础。
(4)清理画布:当想从一个复杂的坐标轴中只移除某个特定元素(如一条线或一个图例),而不影响其他元素时。
delete 函数就是执行这些操作的“手术刀”。
核心函数:delete
delete 函数的作用是销毁指定的图形对象,并将其从其父对象的 Children 列表中移除,同时释放相关资源。
语法
delete(h)
参数说明
h:要删除的一个或多个图形对象的句柄。h 可以是单个句柄,也可以是一个包含多个句柄的向量。
返回值
无
不同使用方法的举例
删除单个图形对象
这是最常见的用法,精准地移除一个已获取其句柄的对象。
示例
删除坐标轴中的一条线x = linspace(0, 2*pi);
y1 = sin(x);
y2 = cos(x);
h1 = plot(x, y1, 'b-', 'LineWidth', 2); hold on;
h2 = plot(x, y2, 'r--', 'LineWidth', 2);
legend('sin(x)', 'cos(x)');
title('删除前');
pause(2); % 暂停2秒以观察效果
% 获取h1的句柄并删除它
delete(h1);
title('删除后:sin(x)线已被移除');
在这个例子中,只有代表 sin(x) 的蓝色线条被删除,而坐标轴、另一条线、图例和标题都完好无损。
删除多个图形对象
可以将多个句柄放入一个向量中,然后一次性删除它们。
示例
删除一个Figure中的所有文本对象figure;
plot(1:10);
title('这是标题');
xlabel('这是X轴标签');
ylabel('这是Y轴标签');
text(5, 8, '这是一个文本注释');
pause(2);
% 找到当前坐标轴中所有类型为'text'的对象
text_handles = findobj(gca, 'Type', 'text');
% 一次性删除所有找到的文本对象
delete(text_handles);
执行后,标题、轴标签和文本注释都会消失。
删除整个Figure窗口
删除Figure句柄等同于关闭该窗口。
示例
创建并关闭多个窗口fig1 = figure('Name', '数据图1');
fig2 = figure('Name', '数据图2');
fig3 = figure('Name', '临时图');
% ... 在这里进行一些绘图操作 ...
% 假设fig3不再需要,直接关闭它
delete(fig3);
% 也可以一次性关闭多个窗口
delete([fig1, fig2]);
删除坐标轴的所有子对象
这是一个非常实用的技巧,相当于“清空画布”,但保留坐标轴本身(如范围、标签等)。
示例
清空坐标轴figure;
ax = axes;
plot(ax, 1:10, 'o-');
hold on;
bar(ax, 5:2:15, 'FaceColor', 'r');
title('清空前');
pause(2);
% 获取坐标轴的所有子对象并删除
delete(get(ax, 'Children'));
title('清空后:坐标轴保留,内容已清除');
% 注意:此时坐标轴范围可能因为数据的消失而自动调整
这比 cla 命令更底层,cla 是一个高级命令,它本质上也是通过删除子对象来工作的,但会额外重置一些属性。
知识扩展
| 函数 | 作用对象 | 作用效果 | 等效的 delete 操作 |
| delete | 任意图形对象 | 销毁指定的对象,非常灵活 | delete(h) |
| clf | 当前Figure | 清空当前Figure窗口(删除所有子对象),但保留窗口本身和其属性。 | delete(get(gcf, 'Children')) |
| cla | 当前Axes | 清空当前坐标轴(删除所有子对象),但保留坐标轴本身和其属性。 | delete(get(gca, 'Children')) |
| close | Figure | 关闭Figure窗口,并删除其所有内容。 | delete(gcf) |
delete 与 clf, cla, close 的区别
这是一个常见的混淆点,理解它们的区别至关重要。
简单记忆:
delete 是“狙击枪”,指哪打哪。
clf/cla 是“清空”,把容器里的东西倒掉,但容器还在。
close 是“拆房子”,把整个窗口都拆了。
allchild 函数
get(handle, 'Children') 只返回直接子对象。
而 allchild(handle) 会返回所有后代对象(包括“孙子”、“重孙子”等)。
在复杂的图形中,使用 allchild 可能更保险。
% 删除坐标轴的所有后代(效果通常与'Children'相同,但更彻底)
delete(allchild(gca));
动画中的应用示例
delete 在动画中是核心,下面是一个简单的点沿曲线移动的动画。
figure;
ax = gca;
% 绘制一条静态的曲线作为路径
x_path = linspace(0, 2*pi);
y_path = sin(x_path);
plot(ax, x_path, y_path, 'b--');
% 创建一个初始的点
h_point = plot(ax, x_path(1), y_path(1), 'ro', 'MarkerSize', 10, 'MarkerFaceColor', 'r');
% 设置坐标轴范围,防止动画时跳动
xlim(ax, [0, 2*pi]);
ylim(ax, [-1.5, 1.5]);
% 动画循环
for i = 1:length(x_path)
% 在每一帧,先删除旧的点
delete(h_point);
% 在新位置绘制一个新的点,并获取其句柄
h_point = plot(ax, x_path(i), y_path(i), 'ro', 'MarkerSize', 10, 'MarkerFaceColor', 'r');
pause(0.01); % 短暂暂停以形成动画效果
end
在这个循环中,如果不 delete(h_point),屏幕上会留下一条由所有点组成的红色轨迹,而不是只有一个点在移动。

被折叠的 条评论
为什么被折叠?



