Can I use arrows to move Data Tips on scatter plots?
    8 views (last 30 days)
  
       Show older comments
    
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.
0 Comments
Accepted Answer
  Mario Malic
      
 on 7 Jan 2021
        
      Edited: Mario Malic
      
 on 8 Jan 2021
  
      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.
% 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 Comments
  Mario Malic
      
 on 8 Jan 2021
				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.
More Answers (1)
  Adam Danz
    
      
 on 7 Jan 2021
        
      Edited: Adam Danz
    
      
 on 7 Jan 2021
  
      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)
0 Comments
See Also
Categories
				Find more on Annotations 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!

