datacursormode: how to display info about current data point in relation to all data points on the same figure?

9 ビュー (過去 30 日間)
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

回答 (1 件)

Yair Altman
Yair Altman 2017 年 11 月 20 日
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 件のコメント
David Rankin
David Rankin 2018 年 1 月 21 日
編集済み: David Rankin 2018 年 1 月 21 日
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
Fritz 2018 年 8 月 17 日
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

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeMatrix Indexing についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by