我在图中创建了一组轴,并为其'ButtonDownFcn'属性分配了一个回调,如下所示:
HRaxes = axes('Parent', Figure, 'Position', [.05 .60 .9 .35],...
'XLimMode', 'manual', 'ButtonDownFcn', @HR_ButtonDown);其中回调函数的定义如下:
function HR_ButtonDown(hObject, eventData)
%# Do some stuff here when the axes is clicked on...
end回调运行得很好,直到我在轴上绘制了一些东西,如下所示:
plot(HRaxes, data.HR_X, data.HR_Y, 'b');之后,当我单击轴时,回调就不再触发。哪里出了问题,我该如何修复它?
发布于 2011-03-11 23:51:47
这里的主要问题是函数PLOT是一个高级绘图函数,这意味着它会将对象添加到绘图中,并将修改现有的绘图设置。如果查看'NextPlot' property for axes objects,您将看到它有三个设置,用于确定高级绘图函数如何影响轴对象:
add -使用现有轴绘制图形objects.replace -将除Position之外的所有轴属性重置为默认值,并在显示图形之前删除所有轴子对象(等效于cla reset).replacechildren -移除所有子对象,但不重置轴属性(等效于cla).由于'replace'是默认设置,因此当您调用PLOT时,为'ButtonDownFcn'回调设置的句柄将被重置为nothing,从而关闭单击按钮的行为。有两种方法可以避免这种情况:
'NextPlot'特性设置为'add' (添加到现有打印对象)或'replacechildren' (替换现有打印对象,但保留当前axes特性设置)。HRaxes = axes('Parent',Figure,'Position',.05 .60 .9 .35,...“‘XLimMode”,“manual”,“ButtonDownFcn”,@HR_ButtonDown,...‘'NextPlot','add');plot(HRaxes,data.HR_X,data.HR_Y,’b‘);使用不修改现有绘图属性的低级绘图例程(如LINE)的
HRaxes = axes('Parent',Figure,'Position',.05 .60 .9 .35,...‘'XLimMode','manual','ButtonDownFcn',@HR_ButtonDown);line(data.HR_X,data.HR_Y,'Parent',HRaxes,’颜色‘,'b');
发布于 2012-03-14 08:44:42
@David Snyder,注意到image对象也可以有一个ButtonDownFcn回调属性。然后,在回调中,您可以通过Parent属性或ancestor函数访问相应的axes属性。例如,假设您要在ButtonDownFcn回调中使用像素的位置和单击时所用的按钮。绘制图像时,请使用
imh = image(some_image);
set(imh,'ButtonDownFcn',@position_and_button);您在别处定义回调的位置
function position_and_button(hObject,eventdata)
Position = get( ancestor(hObject,'axes'), 'CurrentPoint' );
Button = get( ancestor(hObject,'figure'), 'SelectionType' );
%# do stuff with Position and Buttonhttps://stackoverflow.com/questions/5273481
复制相似问题