这是 MATLAB 的一种特殊情况,并且没有很好的文档记录。
您需要考虑两件事:
1) 最明显的部分。当您在axes 中绘制某些内容时,该情节位于前景中。因此,当您单击 axes 时,顶部的情节会拦截该点击并尝试处理它。您需要从axes 中的绘图/散点图/图像对象中禁用鼠标单击捕获。为此,您必须将分散对象的HitTest 属性设置为'off'。 (最近的 MATLAB 版本更改了该属性的名称,现在称为PickableParts)。
2) 不太明显和记录在案。它曾经在 axes ButtonDownFcn 回调的文档中,但不再解释(尽管行为仍然存在)。这是我在旧论坛上可以找到的:
调用 PLOT 时,如果坐标区 NextPlot 属性设置为 'replace'
(默认情况下)axes 的大部分属性(包括
ButtonDownFcn) 被重置为其默认值。
将axes NextPlot 属性更改为'replacechildren' 以避免这种情况,
或者在调用PLOT之后设置ButtonDownFcn,或者使用低级LINE
函数而不是更高级别的 PLOT 函数。
这也在这里讨论和解释:Why does the ButtonDownFcn callback of my axes object stop working after plotting something?
对于您的情况,我尝试了set(axe_handle,'NextPlot','replacechildren'),它可以让鼠标点击到达ButtonDownFcn,但不幸的是它对axes 限制和LimitModes 造成了严重破坏......所以我选择了第二种解决方案,即在axes中的每一个情节之后重新定义ButtonDownFcn的回调。
总而言之,pushbutton1_Callback 的代码应该是:
function pushbutton1_Callback(hObject, eventdata, handles)
% Whatever stuff you do before plotting
% ...
% Plot your data
handles.plot = scatter(X,Y, 'parent', handles.Method1axes1);
% Disable mouse click events for the "scatterplot" object
set(handles.plot,'HitTest','off') ;
% re-set the "ButtonDownFcn" callback
set(handles.Method1axes1,'ButtonDownFcn',@(s,e) Method1axes1_ButtonDownFcn(s,e,handles) )
而对于你的axes鼠标点击事件,你不妨保留新生成对象的句柄:
function Method1axes1_ButtonDownFcn(hObject, eventdata, handles)
handles.newfig = figure ;
handles.axes1copy = copyobj( handles.Method1axes1 , handles.newfig ) ;
请注意,我只是使用copyobj 函数而不是绘制新集合,这在您需要重现绘图时非常方便。
插图: