How to get the handles of a subplot?

13 visualizzazioni (ultimi 30 giorni)
Meshooo
Meshooo il 11 Nov 2016
Commentato: Meshooo il 16 Nov 2016
Dear all,
I want to have a good control to images shown in a subplot figure using a right click of the mouse.
My code as follows:
function my_test()
handles.f = figure;
handles.a = subplot(2,1,1)
imshow('cameraman.tif');
handles.b = subplot(2,1,2)
imshow('moon.tif');
%
set(handles.f,'ButtonDownFcn',{@imageX_ButtonDownFcn});
guidata(handles.a,handles);
function imageX_ButtonDownFcn(hObject, eventdata, handles)
handles=guidata(hObject);
switch lower(get(handles.f, 'selectiontype'))
case 'alt' % right click
I = gcf %get the image from this subplot where you made the right click
BW = im2bw(I) %do something
imshow(BW); %show BW in the same subplot
end
I want of I made a right click to the upper subplot then the image in this subplot will be binarized. Same thing for the lower subplot.
I think the above code is not working because I am not having access to the subplot handles. So I have two subplot.
Any idea how to make it works?
Thank you very much.
Meshoo
  1 Commento
Adam
Adam il 11 Nov 2016
handles will not get passed to a user created callback so you would want to remove that 3rd input argument from your
function imageX_ButtonDownFcn(hObject, eventdata, handles)
Obviously you can explicitly pass it in, but you should never do this. What you are doing instead, in getting handles from the hObject is the correct way to get the handles, if you also do what Jan Simon suggests below.

Accedi per commentare.

Risposta accettata

Jan
Jan il 11 Nov 2016
Do not use the ButtonDownFcn of the figure, but of the subplots:
% Instead of: set(handles.f,'ButtonDownFcn',{@imageX_ButtonDownFcn});
set(handles.a, 'ButtonDownFcn', @imageX_ButtonDownFcn);
set(handles.b, 'ButtonDownFcn', @imageX_ButtonDownFcn);
Then hObject is the subplot's handle in the callback.
  6 Commenti
Adam
Adam il 14 Nov 2016
True, so the choice is yours really, depending whether it is more useful to have the axes handle or the image handle directly in your callback.
In a general case it is easier to retrieve the axes handle from the image (it will always be its 'parent') whereas you may plot many objects on the axes so retrieving the image from the 'Children' array can be messy, but if you just have an axes and 1 image then either works fine.
Meshooo
Meshooo il 16 Nov 2016
Indeed thank you very much Adam and Jan.

Accedi per commentare.

Più risposte (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by