如何在已填充的GUI轴中使用“ ButtonDownFcn”?

时间:2018-12-16 17:49:48

标签: matlab matlab-guide matlab-gui

我在指南中制作了一个非常简单的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);

我在做什么错了?

2 个答案:

答案 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函数,当您需要复制图形时非常方便。


插图:

enter image description here

答案 1 :(得分:0)

  

如果要将图形设置为在鼠标上放大和缩小   滚动/单击,然后仅在以下位置设置所需轴的zoom属性   m文件中的 OpeningFcn

例如,在GUI的m文件中的OpeningFcn中,输入以下代码。请确保将以下代码放入 OpeningFcn 函数中。

h1 = zoom(handles.Method1axes1);
h1.Enable = 'on';

现在,每次滚动/单击鼠标,您都可以放大/缩小图形。

下面给出了一个名为ZoomAxesDemo的GUI的openFcn屏幕截图示例。

enter image description here