我正在开发一个 GUI,该 GUI 通过创建几个axes
以及colorbar
每个不可见来初始化(这样做是为了使轴保持其预定义Position
)1。存储所有轴和颜色条的句柄。
与 UI 的交互可能会导致图像被绘制在任何一个轴上。通过适当设置所有颜色条的属性,我希望在任何给定时间只显示活动Visible
轴的颜色条。
我对这种方法有疑问,因为我正在使用imagesc
更新我的轴,这会删除与轴关联的任何颜色条,从而使存储的句柄无效。
我的问题是:如何在不删除颜色条的情况下使用imagesc
或image
更新与颜色条关联的轴?
以下是重现此问题的方法:
dbclear in newplot %// Needed for the code to be properly re-runnable
%// Create an example figure containing a colorbar:
figure(); imagesc(imread('cameraman.tif')); colorbar;
%// "Refreshing" the displayed image:
uiwait(msgbox('The image will now be refreshed. A breakpoint will be set in newplot.m'));
dbstop in newplot at 124 %// The line responsible for deleting the colorbar in R2015A/B
imagesc(imread('cameraman.tif'));
设置断点的行newplot.m
内容如下:
cla(ax, 'reset', hsave);
这是(未)令人惊讶的是一种未记录的调用方式cla
(使用 3 个参数),它保留了在hsave
.
我假设删除颜色条是不可避免的一些想法(如果找不到“理智”的解决方案,我将继续这样做):
- 将 a 绑定
DeleteFcn
到将其数据保存到 some 的颜色栏struct
。完成后创建一个新的颜色imagesc
条,然后遍历 的字段struct
并将所有属性分配给新的颜色条对象。 - 根据下面的附录,“每隔一段时间”检查所有颜色
findall(hFig,'type','colorbar')
条是否存在或验证每个轴是否有效。ColorbarPeerHandle
如果无效,重新创建 CB。 - 每当不同的轴激活时删除所有颜色条并仅创建我想显示的 CB。
附录 - ColorBar/Axes 关联:
可以使用以下方法获得与某个轴关联的
hAx
颜色条的句柄(在 hg2 中):hCb = getappdata(hAx,'ColorbarPeerHandle');
可以使用2
axes
获得与颜色条对象关联的句柄:hCb
hAx = hCb.Axes;