Это особый случай для MATLAB, и он не очень хорошо документирован.
Вам нужно учесть 2 вещи:
1) Самая очевидная часть.Когда вы рисуете что-то в своем axes
, график находится на переднем плане.Поэтому, когда вы нажимаете на axes
, верхний график перехватывает этот щелчок и пытается его обработать.Вам необходимо отключить захват щелчка мышью на объектах plot / scatter / image, которые есть в вашем axes
.Для этого вам нужно установить свойство HitTest
вашего разбросанного объекта равным 'off'
.(последние версии MATLAB изменили имя этого свойства, теперь оно называется PickableParts
).
2) Гораздо менее очевидно и задокументировано.Раньше он был в документе для обратного вызова axes
ButtonDownFcn
, но больше не объясняется (хотя поведение сохраняется).Вот что я мог найти на старых форумах:
Когда вы вызываете PLOT, если свойство axes NextPlot
установлено в 'replace'
(что по умолчанию)большинство свойств axes
(включая ButtonDownFcn
) сбрасываются на значения по умолчанию.
Измените свойство axes
NextPlot
на 'replacechildren'
, чтобы избежать этого, или установите ButtonDownFcn
после вызова PLOT или использования функции LINE низкого уровня вместо функции PLOT более высокого уровня.
Это также обсуждается и объясняется здесь: Почему функция обратного вызова ButtonDownFcn моих осейобъект перестает работать после печати чего-либо?
В вашем случае я попытался set(axe_handle,'NextPlot','replacechildren')
, и он работает нормально, чтобы позволить щелчку мыши достичь ButtonDownFcn
, но, к сожалению, он создает хаос сaxes
limit и 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 ) ;
Обратите внимание, что вместо построения нового набора я просто использую *Функция 1060 *, очень удобная для воспроизведения сюжета.
Иллюстрация:
![enter image description here](https://i.stack.imgur.com/ctHQd.gif)