Interactive plotting
Example of interactive plotting: moving the mouse finds the closest data point, visually enhances it and floats a label at the mouse position. The main points are- Linking the WindowButtonMotionFcn figure property to a callback function.
- Using the CurrentPoint axes property to determine the mouse position.
- The global variables for data and properties.
- Directly setting line and plot element properties to control characteristics.
- The extra axes covering the original plot.
- Setting the figure's DoubleBuffer property to 'on'.
function labeller global data_x data_Y marker_cells colors overlay_ax data_x = (-1:0.1:1)'; data_Y = [data_x data_x.^2 data_x.^3] marker_cells{1} = 'o'; % as many cells as there are columns in data_Y marker_cells{2} = 'x'; marker_cells{3} = 'v'; colors = [0 0 0; 1 0 0; 0 1 1]; % as many rows as there are columns in data_Y figure; set(gcf, 'DoubleBuffer', 'on'); set(gcf, 'WindowButtonMotionFcn', @movefunc); plot_iets; overlay_ax = axes('Position',get(gca,'Position'),... 'XAxisLocation','top',... 'YAxisLocation','right',... 'Color','none',... 'XColor','k','YColor','k',... 'XLim', get(gca,'XLim'),... 'YLim', get(gca,'YLim')); function plot_iets global data_x data_Y marker_cells colors p0 = plot(data_x, data_Y); for n = 1:size(data_Y, 2), set(p0(n), 'Marker', marker_cells{n}); set(p0(n), 'Color', colors(n, :)); end; function movefunc(varargin) global data_x data_Y marker_cells colors overlay_ax axes(overlay_ax); pos = get(gca, 'CurrentPoint'); x = pos(1, 1); y = pos(1, 2); afstand = []; index_closest = []; for v = 1:size(data_Y, 2), afstanden_x = (data_x - x) .^ 2; afstanden_y = (data_Y(:, v) - y) .^ 2; afstanden = sqrt(afstanden_x + afstanden_y); [afstand(v), index_closest(v)] = min(afstanden); end; [minv, indexv] = min(afstand); nearest_x = data_x(index_closest(indexv)); nearest_y = data_Y(index_closest(indexv), indexv); cla; p0 = line(nearest_x, nearest_y); set(p0, 'LineWidth', 3); set(p0, 'Marker', marker_cells{indexv}); set(p0, 'MarkerSize', 10); set(p0, 'Color', colors(indexv, :)); text(x, y, [num2str(nearest_x) ' ' num2str(nearest_y)]);