Can I use arrows to move Data Tips on scatter plots?

17 次查看(过去 30 天)
I know that when using the plot function with data tips you can use the arrow keys to move the data tip through the data set. Is there a way to do this with scatter plots as well? I need to be able to define the marker color individually, which is why I'm using scatter instead of plot.

采纳的回答

Mario Malic
Mario Malic 2021-1-7
编辑:Mario Malic 2021-1-8
Hi David,
Edit: I have updated the code and it works. It's better if the callback is on KeyPressFcn, especially for plots with many points.
I have taken part of code from Adam's answer, thanks Adam!
% clear functions % On the second run, datatip will continue from where it stopped the previous run, if you mind that, uncomment this line
fig = figure('KeyPressFcn', @ArrowKeyPressed);
ax = axes(fig);
x = linspace(0,2*pi,25);
y = cos(x) + rand(1,numel(x))/2;
sz = (abs(sin(x))*4+1)*25;
c = linspace(1,10,numel(x));
scatter(ax, x,y,sz,c,'filled','MarkerEdgeColor', 'k');
grid on
It is possible to write a callback for the figure that would detect arrow key presses
function ArrowKeyPressed(Source, Event)
persistent dtNum
if isempty(dtNum) % Initialise the variable
dtNum = 0;
end
% Get axes handle
ax = findall(Source, 'Type', 'axes');
% Get the scatter object
h = findall(ax, 'Type', 'scatter');
% Get the datatips associated with scatter object
datatipObjs = findobj(h,'Tag','datatip');
% Get the number of points
numPoints = length(h.XData); % assuming x is a vector
% Setting up the counter
switch Event.Key
case 'leftarrow'
if dtNum > 1
dtNum = dtNum - 1;
else
dtNum = 1;
end
case 'rightarrow'
if ~isequal(dtNum, numPoints)
dtNum = dtNum + 1;
end
otherwise
return
end
% Removing the previous (all if there are more) and creating the next datatip
if isvalid(datatipObjs); delete(datatipObjs); end
datatip(h, h.XData(dtNum), h.YData(dtNum));
end
  6 个评论
David K
David K 2021-1-8
Wrt data points that are not finite, the default functionality for plot is to just jump over these values. It wouldn't be too difficult to put in a check to account for that and increment to the next point if need be.
Mario Malic
Mario Malic 2021-1-8
That callback will be active only on the figure that has ArrowKeyPressed callback specified, other figures will have the normal functionality.
Also, on the normal plots, arrow key datatips work only when datacursor mode is on. To have the same functionality for scatter plots, I guess one has to find information on Undocumented MATLAB.
What I ment on my comment with NaN values, if you use
datatip(h, h.XData(dtNum), h.YData(dtNum))
on point with NaN on XData, it will generate datatip on the first point. I guess this is not working as intended, datatip shouldn't be generated at all.

请先登录,再进行评论。

更多回答(1 个)

Adam Danz
Adam Danz 2021-1-7
编辑:Adam Danz 2021-1-7
It appears that keyboard control of DataTips is not supported in scatter().
However, a less-than-perfect workaround is to plot very small (nearly invisible) points on top of the scatter markers using plot() which will support keyboard control of DataTips.
Demo:
% rng('default') % for reproducibility
x = linspace(0,2*pi,25);
y = cos(x) + rand(1,numel(x))/2;
sz = (abs(sin(x))*4+1)*25;
c = linspace(1,10,numel(x));
scatter(x,y,sz,c,'filled','MarkerEdgeColor', 'k')
grid on
% plot() markers must go on top; My tests indicate that marker size
% smaller than 0.5 won't work. Setting Marker style to "none" also
% does not work.
hold on
plot(x,y,'ko','MarkerSize',0.5)

类别

Help CenterFile Exchange 中查找有关 Data Distribution Plots 的更多信息

产品

Community Treasure Hunt

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

Start Hunting!

Translated by