datacursormode: how to display info about current data point in relation to all data points on the same figure?
10 views (last 30 days)
Show older comments
Hello! I am selecting multiple data points on the same figure using Data Cursor (Shift+Click). I would like that UpdateFcn displays if last selected data point (for example) has pair (i.e. if total number of data points is even). I have made some code but all I get is "unable to update data tip using custom update function". Thank you for any comments.
function getDataFromFigure1
fig = figure;
a = -16; t = 0:60;
plot(t,sin(a*t));
dcm_obj = datacursormode(fig);
set(dcm_obj,'UpdateFcn',@myUpdateFcn,'enable', 'on');
function txt = myUpdateFcn(~, event_obj)
% read out all data points
mypoints = getCursorInfo(dcm_obj);
p=cell2mat({mypoints.Position}');
N=size(pos(:,1),1);
if mod(N,2)==0
txt = {'this data point does not have pair'};
else
txt = {'this data point has pair'};
end
end
end
0 Comments
Answers (1)
Yair Altman
on 20 Nov 2017
You can get the clicked line object from event_obj.Target, and from there get the corresponding data points for the entire line:
function txt = myUpdateFcn(hDataTip, event_obj)
% Get the clicked data coordinates
clickedPoint = hDataTip.Position; % [x,y,z] array
% Now get all the data points on the clicked line
hLine = event_obj.Target; % or: hDataTip.DataSource or: hDataTip.Host
xData = hLine.XData; % 1xN array
yData = hLine.YData; % 1xN array
zData = hLine.ZData; % 1xN array
... % now do something useful with all this info
end
You can easily modify the code above to compare the clicked data point's coordinates to all the other data-points in the clicked line.
2 Comments
David Rankin
on 21 Jan 2018
Edited: David Rankin
on 21 Jan 2018
edited with solution that I found:
I have a similar problem but this code seems to solve it. I look at the Tag property to determine which line has been clicked on. Previously I was using IF statements and it was causing the error message.
However, the OTHERWISE case doesn't work as expected. If a plot is passed in without a tag named in the list, it returns an error message instead of the message in the OTHERWISE case. I would love to find out why this is happening but for now I will just make sure I cover the cases.
Here is my code:
function txt = datatiptxt(~, hDatatip)
pos = get(hDatatip, 'Position');
t = get(hDatatip.Target, 'Tag');
switch (t)
case 'Temperature'
val = pos(2);
str = [num2str(val), ' C'];
txt = {['Time: ', num2str(pos(1))], str};
case 'Humidity'
val = pos(2);
str = [num2str(val), ' pct'];
txt = {['Time: ', num2str(pos(1))], str};
otherwise
val = pos(2);
txt = {["datatip: ', num2str(pos(1)), str);
end
end
Fritz
on 17 Aug 2018
Hi David
Error and warning messages do not seem to work inside the datatip update function.
And there is a syntax error in the second line of your OTHERWISE statement.
Should be:
{['datatip: ', num2str(pos(1))], str};
Kind regards
See Also
Categories
Find more on Matrix Indexing in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!