为什么我的轴对象的ButtonDownFcn回调在绘制内容后停止工作?

时间:2011-03-11 13:28:35

标签: matlab callback plot axes

我正在图中创建一组轴,并为其'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');

当我点击轴时,回调不会再触发。出了什么问题,我该如何解决?

2 个答案:

答案 0 :(得分:2)

这里的主要问题是函数PLOT是一个高级绘图函数,这意味着它将对象添加到图中将修改现有的情节设置。如果查看'NextPlot' property for axes objects,您将看到它有三个设置可确定高级绘图功能如何影响轴对象:

  • add - 使用现有轴绘制图形对象。

  • replace - 将除Position之外的所有轴属性重置为其默认值,并在显示图形之前删除所有轴子项(相当于cla reset)。

  • replacechildren - 删除所有子对象,但不要重置轴属性(相当于cla)。

由于'replace'是默认设置,因此当您调用PLOT时,为'ButtonDownFcn'回调设置的句柄将重置为空,从而关闭按钮单击行为。有两种方法可以避免这种情况:

  • 将轴的'NextPlot'属性设置为'add'(添加到现有绘图对象)或'replacechildren'(以替换现有绘图对象但保持当前在打电话给PLOT之前,你可以通过电话设置)。

    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, 'Color', 'b');
    

答案 1 :(得分:2)

@David Snyder,观察image对象也可以拥有ButtonDownFcn回调属性。然后在您的回调中,您可以通过axes属性或Parent函数访问相应的ancestor属性。例如,假设您要在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 Button