我正在图中创建一组轴,并为其'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');
当我点击轴时,回调不会再触发。出了什么问题,我该如何解决?
答案 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