matlab清除轴,matlab – 在现有轴内显示新图像,无需删除颜色条

该博客讨论了在MATLAB GUI中使用imagesc更新图像时如何保持颜色条的问题。作者遇到的问题是,使用imagesc会删除与轴关联的颜色条。为了解决这个问题,提出了两种解决方案:safeUpdateImage1和safeUpdateImage2,分别通过创建新图像对象和更新现有图像对象来避免颜色条被删除。这两种方法在不同的场景下适用,旨在确保在更新图像时颜色条仍然可见。
摘要由CSDN通过智能技术生成

我正在开发一个GUI,通过创建几个

axes以及每个的隐形

colorbar进行初始化(这样做是为了使轴保持其预定义的

Position)

1.存储所有轴和颜色条的手柄.

与UI的交互可能导致在任何一个轴上绘制图像.我希望通过适当地设置所有颜色条的可见属性,只在任何给定时间显示活动轴的颜色条.

我遇到了这种方法的问题,因为我使用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);

这是(un)令人惊讶的一种未记录的方式来调用cla(带有3个参数)来保留在hsave中找到句柄的对象.

我假设使用彩条删除的一些想法是不可避免的(如果找不到“理智”的解决方案,我会追求这种想法):

>将DeleteFcn绑定到将其数据保存到某个结构的颜色条.在imagesc完成后创建一个新的颜色条,然后迭代结构的字段并将所有属性分配给新的颜色条对象.

>使用findall(hFig,’type’,’colorbar’)检查所有颜色条中的“偶尔”,或者验证每个轴是否具有有效的ColorbarPeerHandle,如下面的附录所示.如果无效,重新创建CB.

>当不同的轴变为活动状态时删除所有颜色条,并仅创建我想要显示的CB.

附录 – ColorBar / Axes关联:

>处理与某个轴相关的颜色条hAx可以使用以下方式获得(在hg2中):

hCb = getappdata(hAx,'ColorbarPeerHandle');

>处理与颜色条对象关联的轴hCb可以使用2获得:

hAx = hCb.Axes;

最佳答案 我设法提出了几个解决方案:

> safeUpdateImage1 – 基于在使用hold之后通过在轴内创建新Image对象来规避cla(…).这对于轴中不一定存在图像的情况很有用.

> safeUpdateImage2 – 遵循mikkola’s suggestion,基于更新现有的Image对象.这适用于已有ColorBar和与轴关联的Image的情况.

以下是两个解决方案与原始问题的演示:

function [] = Problem

dbclear in newplot %// Needed for the code to be properly re-runnable

%// Create an example figure containing a colorbar:

Img = imread('cameraman.tif');

figure(); imagesc(Img); hAx = gca; colorbar;

%// Refreshing the displayed image (comment/uncomment as needed):

switch questdlg('Please select an image update method:','Update method selection',...

'Broken','Safe1','Safe2','Safe1')

case 'Broken'

brokenUpdateImage(hAx,255-Img);

case 'Safe1'

safeUpdateImage1(hAx,255-Img);

case 'Safe2'

safeUpdateImage2(hAx,255-Img);

end

end

function brokenUpdateImage(hAx,newImg)

uiwait(msgbox('The image will now be refreshed. A breakpoint will be set in NEWPLOT'));

dbstop in newplot at 124 %// The line responsible for deleting the colorbar in R2015A/B

imagesc(newImg,'Parent',hAx);

end

% For cases when the only desired child is an Image and the axes contents are unknown

function safeUpdateImage1(hAx,newImg,imgType,imgUpdateFcn)

if nargin < 4 || isempty(imgUpdateFcn)

imgUpdateFcn = @imagesc;

end

if nargin < 3 || isempty(imgType)

imgType = 'Image';

end

if strcmp(hAx.NextPlot,'replace') %// Equivalent to checking "ishold == false"

hAx.NextPlot = 'add'; %// Equivalent to "hold on"

%// hCurrImgs = get(hAx,'Children'); %// Deletes all types of Children

hCurrImgs = findall(hAx,'type','Image'); %// Deletes only graphical objects of type

%// "matlab.graphics.primitive.Image"

for ind1=1:numel(hCurrImgs)

delete(hCurrImgs(ind1));

end

imgUpdateFcn(newImg,'Parent',hAx);

if strcmpi(imgType,'Image')

axis(hAx,'tight','ij');

%// 'tight' - XLimMode, YLimMode, and ZLimMode change to 'auto'. The limits automatic-

%// ally update to incorporate new data added to the axes. To keep the limits

%// from changing when using hold on, use axis tight manual.

%// 'ij' — Reverse direction. For axes with a 2-D view, the y-axis is vertical with

%// values increasing from top to bottom.

end

end

end

%// When it's known that the axes contains at least one Image:

function safeUpdateImage2(hAx,newImg,~,~)

%//

hCurrImgs = findall(hAx,'type','Image');

%//

hCurrImgs(1).CData = newImg; %// In this example, only update the "topmost" child

end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值