我在指南中制作了一个非常简单的GUI,其中有一个由按钮启动的绘图功能,该按钮可在轴上绘制散点图(称为Method1axes1):
handles.plot = scatter(X,Y, 'parent', handles.Method1axes1);
现在,我希望用户能够单击轴(图)来获得新的更大的数字。我尝试了下面的代码,如果我不先绘制坐标轴,它将起作用。一旦运行绘图功能,散点图就会出现在Method1axes1中,但我无法再单击该图。
% --- Executes on mouse press over axes background.
function Method1axes1_ButtonDownFcn(hObject, eventdata, handles)
figure
scatter(X,Y);
我在做什么错了?
答案 0 :(得分:3)
这是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的破坏...我选择了第二个解决方案,该解决方案是在ButtonDownFcn
中的每个绘图之后重新定义axes
的回调。
因此,总而言之,您的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
函数,当您需要复制图形时非常方便。
插图:
答案 1 :(得分:0)