如何在填充的 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
函数,当您需要重现绘图时非常方便。
插图:
我在指南中制作了一个非常简单的 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 theaxes
(includingButtonDownFcn
) are reset to their default values.Change the
axes
NextPlot
property to'replacechildren'
to avoid this, or set theButtonDownFcn
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
函数,当您需要重现绘图时非常方便。
插图: