3

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

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

4

2 回答 2

2

这里的主要问题是函数PLOT是一个高级绘图函数,这意味着它将对象添加到绘图中会修改现有的绘图设置。如果您查看'NextPlot'轴对象的属性,您将看到它具有三个设置,这些设置确定高级绘图函数如何影响轴对象:

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

  • replace— 将所有坐标区属性重置Position为默认值,并在显示图形之前删除所有子坐标区(相当于cla reset)。

  • replacechildren— 移除所有子对象,但不重置坐标区属性(相当于cla)。

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

  • 在调用PLOT之前,将坐标区的属性设置'NextPlot''add'(添加到现有绘图对象)或(替换现有绘图对象但保留当前坐标区属性设置) 。'replacechildren'

    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');
    
于 2011-03-11T15:51:47.087 回答
2

@David Snyder,请注意image对象也可以具有ButtonDownFcn回调属性。然后在您的回调中,您可以通过属性或函数访问相应的axes属性。例如,假设您想在 ButtonDownFcn 回调中使用像素的位置和您单击的按钮。绘制图像时,请使用Parentancestor

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
于 2012-03-14T00:44:41.613 回答