如何在填充的 GUI 轴中使用 "ButtonDownFcn"?

How to use "ButtonDownFcn" in a populated GUI axes?

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

我做错了什么?

If you want to set the figure/graph to enlarge and shrink on mouse scroll/click, then just set the zoom property of the required axes in OpeningFcn within the m file.

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

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

现在,在每只鼠标 scroll/click 上,您都可以缩放 in/out 图表。

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

这是 MATLAB 的一种特例,没有很好的文档记录。

您需要考虑两件事:

  • 1)最明显的部分。当您在 axes 中绘制某些内容时,该图位于前景中。所以当你点击你的 axes 时,顶部的情节拦截点击并尝试处理它。您需要从 axes 中的 plot/scatter/image 个对象中禁用鼠标单击捕获。为此,您必须将散点对象的 HitTest 属性 设置为 'off'。 (最近的 MATLAB 版本已经更改了这个 属性 的名称,现在称为 PickableParts)。

  • 2) 更不明显和记录。它曾经在 axes ButtonDownFcn 回调的文档中,但不再解释(尽管行为仍然存在)。这是我在旧论坛上可以找到的内容:

When you call PLOT, if the axes NextPlot property is set to 'replace' (which it is by default) most of the properties of the axes (including ButtonDownFcn) are reset to their default values.

Change the axes NextPlot property to 'replacechildren' to avoid this, or set the ButtonDownFcn after calling PLOT, or use the low-level LINE function instead of the higher-level PLOT function.

这也在这里讨论和解释: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 函数,当您需要重现绘图时非常方便。


插图: