Can I use arrows to move Data Tips on scatter plots?
12 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
David K
el 7 de En. de 2021
Comentada: Mario Malic
el 8 de En. de 2021
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 comentarios
Respuesta aceptada
Mario Malic
el 7 de En. de 2021
Editada: Mario Malic
el 8 de En. de 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 comentarios
Mario Malic
el 8 de En. de 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.
Más respuestas (1)
Adam Danz
el 7 de En. de 2021
Editada: Adam Danz
el 7 de En. de 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:
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/481693/image.gif)
% 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 comentarios
Ver también
Categorías
Más información sobre Graphics Object Programming en Help Center y File Exchange.
Productos
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!