有没有办法在不影响 uistack 顺序的情况下更改 matlab 中的当前轴对象?

Is there a way to change the current axes object in matlab without affecting the uistack ordering?

Matlab 提供了一个名为 uistack 的函数,用于在深度方向上排列 UI 个对象(哪些对象在哪些其他对象的前面,等等)。还有一个函数 (axes) 用于设置当前轴。我发现当我调用 axes 时,它还会自动将该 axes 对象放在所有其他对象(包括 uipanels 等)的前面。有什么办法可以避免这种情况吗?

这里有一些代码可以说明我的问题:

figure(1)
clf

ax1 = axes();
set(ax1,'position',[.1 .1 .5 .5],'xtick',[],'ytick',[],'color','r')

ax2 = axes();
set(ax2,'position',[.3 .3 .5 .5],'xtick',[],'ytick',[],'color','b')

% blue (ax2) is on top since it was created after ax1

uistack(ax1,'top')

% red (ax1) is now on top (good)

axes(ax2)

% [do some plotting or something in ax2]

% blue (ax2) is now on top (I'd rather avoid this)

要使 h_ax 成为图 h_fig 中的当前坐标轴而不将这些坐标轴放在前面,请使用:

set(h_fig, 'CurrentAxes', h_ax)

为什么这有效

axes函数的documentation,语法axes(cax)

makes cax the first object listed in the Children property of the figure and sets the CurrentAxes property of the figure to cax.

使 caxChildren 属性 中列出的第一个对象是导致它在前面的原因。这可以通过修改 属性 并查看效果来检查。此外,通过查看 uistack 的代码,可以看出该函数在内部执行的操作是重新排列图形 Children.

的顺序

将图形的 CurrentAxes 属性 设置为 cax 是导致这些轴成为当前轴的原因。这可以通过修改属性、绘制一些东西并查看绘图出现在哪个轴上来检查。

因此,将图形的 CurrentAxes 属性 设置为所需的轴即可实现所需的效果,而无需将这些轴移到前面。