Get data point that was clicked on in graph

I have a plot on a GUIDE GUI that gives some measurement made from frames in a video. What my user wants is to click on a point in the plot and display the frame from the video that corresponds to that point in the graph. I was told from Mathworks tech support that this is not possible. But is it really impossible? They told me I could setup a callback function for the graph (axes) and then when I clicked on it I would go into the callback function and I could get the whole XData and YData vectors but I could not get the one point I clicked on, even though it shows up in the graph with the X and Y as data tips. So for example:
x=1:8;
y = rand(1, numel(x));
plot(x, y, 'b.-', 'MarkerSize', 15);
grid on;
And let's say I clicked on the point at x=6. I would go into the callback and be able to get the full 8-element x and y vectors, but the callback function would have no idea where I clicked or what the closest data point to that location is. Is that really true? I find that hard to believe. Is there any easy way to find out what vector element was clicked on? Or do I have to call on the almighty Yair Altman for a favor?

Answers (1)

At your service :-)
t=0:.01:5; y=sin(t); hPlot=plot(t,y);
hPlot.ButtonDownFcn = @(h,e) disp(e.IntersectionPoint);
Now whenever you click on the plot line, it will display the clicked coordinates [x,y,z]. The event data's IntersectionPoint is a 1x3 vector. Of course, to accept mouse clicks, the plot-line's HitTest property must be set to 'on' (or true).

5 Comments

Thanks @Yair Altman but I'm having trouble implementing it in a GUI. Would you mind fixing the very simple attached program to get what X value they clicked on (or was closest to)?
Thanks. Works perfectly. I knew you could do it. You're a genius! 😃
Dear Altman, this is a very simple code, yet a beautiful solution to a big problem. However for my purpose, I need to store these coordinates into a variable. How can it be done?
You can set the ButtonDownFcn callback property value to a handle to a function in your code, and in that function you can access the event's IntersectionPoint in a variable and then use it as you need.
If you need help with this, read the Matlab documentation about using callback functions.

Sign in to comment.

Categories

Find more on 2-D and 3-D Plots in Help Center and File Exchange

Products

Release

R2022b

Asked:

on 30 Jan 2023

Commented:

on 17 Oct 2024

Community Treasure Hunt

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

Start Hunting!