Obtain data points from plot using 'buttondownfcn' nested functions

23 views (last 30 days)
function [Xsig,Ysig] = GetPoint(Figure)
set(Figure,'ButtonDownFcn', @ExtractPoint) ;
function ExtractPoint(ClickedPoint,~)
waitforbuttonpress ;
Xsig = get(ClickedPoint,'XData') ;
Ysig = get(ClickedPoint,'YData') ;
end
end
I have a plot created in 'Figure'. I would like to be able to select a variety of points on the curve and export the coordinates into the workspace. I have seen people use ginput and datacursor mode in other forums but neither of these methods work since I have a 2 subplots.
Any help is appreciated. Thank you!

Accepted Answer

darova
darova on 2 Jul 2020
Here is an example
function main
x = rand(100,1); % generate random data
y = rand(100,1);
h = plot(x,y,'.r'); % plot data
set([h gcf],'hittest','off') % turn off hittest
set(gca,'buttondownfcn',@func) % assign function to gca
function func(hobj,~)
p = get(hobj,'currentpoint'); % get coordinates of click
d = pdist2([x y],p([1 3])); % find combination of distances
[~,ix] = min(d); % find smallest distance
line(x(ix),y(ix),'linestyle','none','marker','o')
[x(ix),y(ix)]
end
end
  5 Comments
darova
darova on 7 Jul 2020
Try to pass data into UserData property
set(gca,'userdata',num2str(p)) % add this line insdie the function
To get data back
get(gca,'userdata')
% get(gca)
Ahmed
Ahmed on 7 Jun 2023
Hello everyone,
I'm also struggling with this. Where should the function (func) be placed in the code view? I have the similar implementation but my click function doesnt seem to be triggered when I click on the plot. I think the reason is becuase it is in another slider function. So I'm not sure now where to place in my click function in the code view.
% Value changed function: FrequencySlider
function FrequencySliderValueChanged(app, event)
value = app.FrequencySlider.Value;
freq=value;
[d,ix]=min(abs(app.freq_vec-freq));
scatter3(app.UIAxes,app.XYZ(:,1)*10000,app.XYZ(:,2)*10000,abs(app.y(:,ix))*10000,[],abs(app.y(:,ix))*10000,'filled','ButtonDownFcn',@click)
view(app.UIAxes, [0 90]);
c = colorbar(app.UIAxes)
colormap(app.UIAxes, jet)
axis(app.UIAxes, 'tight')
axis(app.UIAxes, 'equal')
app.EditField.Value=value;
function click(~,eventData)
coords = eventData.IntersectionPoint;
app.ZEditField.Value=coords;
end
end

Sign in to comment.

More Answers (0)

Products

Community Treasure Hunt

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

Start Hunting!