您的位置:

Matlab 中 hold on 和 hold off 的使用

一、概述

在 Matlab 中绘制图形时,有时需要在一张图上同时绘制多个函数曲线。此时,我们可以使用 hold on 和 hold off 指令来控制 Matlab 图像窗口中的图形绘制。

二、hold on 和 hold off 的基础语法

hold on和hold off 指令可用来控制曲线的重叠,以便在同一个坐标系下同时绘制多个曲线。

% 比如绘制sin和cos函数
x = 0:0.1:pi;
y1 = sin(x);
y2 = cos(x);

% hold on 命令
plot(x,y1);
hold on;
plot(x,y2);
hold off;%使用 hold off 恢复正常绘图状态

上述代码中,hold on 命令会启用 Matlab 图像窗口的隐藏功能,以允许用户在同一张图中绘制多张图,并且 hold off 命令会将窗口绘图设置为正常状态,以便用户可以在此后的图形中绘制单个线条。

三、hold 的其他参数

因为在控制曲线绘制时,使用 hold on 和 hold off 命令会改变图形对象的状态,所以在绘制图形时,有些用户不会使用 hold off 命令。但是,为保证图形对象的状态不会进一步改变,也可以使用其他 hold 命令参数。

例如:当把 nextplot 属性设置为 add 时,图形中的所有任何绘图都将覆盖到前一个绘图上,从而创建多重图层效果。

 x = [0:pi/100:2*pi];
y1 = sin(x);
y2 = cos(x);

plot(x,y1);
set(gca,'nextplot','add')
plot(x,y2)
set(gca,'nextplot','replace')

上述例子中,使用 set 命令设置 nextplot 属性,将“add”作为其参数输入,这样会持续使用 hold on 的功能在图像窗口画布上绘制图表。

四、hold 区分 Figure 和 Axes 句柄

注意:hold 命令会应用于画图区域的 Figure 和 Axes 对象。虽然在许多情况下, Figure 和 Axes 对象是相同(只有一个 Axes 子对象)的,但在其他情况下,它们是不同的。

如果指定 Axes 对象的父级 Figure 对象在 hold 状态下被保存,那么后续的 Plot 函数可以通过新 Axes 对象使用 hold 命令,从而影响 Figure 对象的现有 Axes 对象。此时,如果您想让某个图表返回到非 hold 状态,请重置该图表的 Axes 对象。

注意,此时 reset 所有的 Axes,而不仅仅是当前 Axes 对象。

% 一个清空reset的例子
x = [0:pi/100:2*pi];
y1 = sin(x);
y2 = cos(x);

figure; 
plot(x,y1);
set(gca,'nextplot','add')
plot(x,y2)

figure;
plot(x,y1);
set(gca,'nextplot','add')
plot(x,y2)
hold on;
plot(x,cos(x),'r--')
hold off;

% Create a new figure
figure;
plot(x,y1);
% This axes is the current axes, which means the next plot command will
% write on it unless hold is active
hold on;
plot(x,cos(x),'r--')
hold(gca,'on')
% This plot will write on the same axes
plot(x,cos(x).^2,'g:') 
hold off;

五、优化曲线的性能和外观

hold 命令可用于优化曲线的性能和外观,例如在多次更新曲线时冻结 Y 轴限制,以避免自动缩放,从而产生可见的闪烁。

 % 追踪 sine 函数的振幅与相位
ax = gca;
hold(ax,'on')
for k = 1:50
   y = sin(k*x + rand*pi/2);
   plot(ax,x,y,'k','LineWidth',1.5)
   ax.YLim = [min(y) max(y)];
   pause(0.1)
end
hold(ax,'off')

六、小结

在 Matlab 中,hold on 和 hold off 命令可用于控制曲线的绘制。在使用这些命令时,请始终注意是否需要设置 Figure 和 Axes 对象的状态。