MATLAB学习文档(二十六)

目录

11.3灵活强大的图形对象句柄

11.3.1 从简单的示例引出图形对象句柄

场景一:简单的绘图

场景二:多个图形的“混乱”

核心概念:图形句柄

场景三:获取并使用句柄

场景四:更复杂的操作

11.3.2 高频应用的图形句柄函数:gcf、gca、get 和 set

gcf - Get Current Figure (获取当前窗口句柄)

功能

语法

参数说明

返回值

使用举例

gca - Get Current Axes (获取当前坐标轴句柄)

功能

语法

参数说明

返回值

使用举例

get - 获取对象属性

功能

语法

参数说明

返回值

使用举例

set - 设置对象属性

功能

语法

参数说明

返回值

使用举例

知识扩展

层次结构(Parent-Child Relationship)

findobj - 强大的对象搜索函数

句柄属性的最佳实践

11.3.3 为图形设置默认的属性

核心概念:为什么要设置默认属性?

核心机制:default 属性前缀

语法

参数说明

设置默认属性的方法与举例

根级别设置(全局默认)

图形窗口级别设置(局部默认)

扩展

查询和移除默认属性

使用 struct 组织默认值

结合 startup.m

11.3.4 delete 函数

核心概念:为什么需要手动删除图形对象?

核心函数:delete

语法

参数说明

返回值

不同使用方法的举例

删除单个图形对象

删除多个图形对象

删除整个Figure窗口

删除坐标轴的所有子对象

知识扩展

delete 与 clf, cla, close 的区别

allchild 函数

动画中的应用示例


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),屏幕上会留下一条由所有点组成的红色轨迹,而不是只有一个点在移动。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值