.. _sphx_glr_gallery_misc_cursor_demo_sgskip.py: =========== Cursor Demo =========== This example shows how to use matplotlib to provide a data cursor. It uses matplotlib to draw the cursor and may be a slow since this requires redrawing the figure with every mouse move. Faster cursoring is possible using native GUI drawing, as in wxcursor_demo.py. The mpldatacursor and mplcursors third-party packages can be used to achieve a similar effect. See https://github.com/joferkington/mpldatacursor https://github.com/anntzer/mplcursors .. code-block:: python from __future__ import print_function import matplotlib.pyplot as plt import numpy as np class Cursor(object): def __init__(self, ax): self.ax = ax self.lx = ax.axhline(color='k') # the horiz line self.ly = ax.axvline(color='k') # the vert line # text location in axes coords self.txt = ax.text(0.7, 0.9, '', transform=ax.transAxes) def mouse_move(self, event): if not event.inaxes: return x, y = event.xdata, event.ydata # update the line positions self.lx.set_ydata(y) self.ly.set_xdata(x) self.txt.set_text('x=%1.2f, y=%1.2f' % (x, y)) plt.draw() class SnaptoCursor(object): """ Like Cursor but the crosshair snaps to the nearest x,y point For simplicity, I'm assuming x is sorted """ def __init__(self, ax, x, y): self.ax = ax self.lx = ax.axhline(color='k') # the horiz line self.ly = ax.axvline(color='k') # the vert line self.x = x self.y = y # text location in axes coords self.txt = ax.text(0.7, 0.9, '', transform=ax.transAxes) def mouse_move(self, event): if not event.inaxes: return x, y = event.xdata, event.ydata indx = min(np.searchsorted(self.x, [x])[0], len(self.x) - 1) x = self.x[indx] y = self.y[indx] # update the line positions self.lx.set_ydata(y) self.ly.set_xdata(x) self.txt.set_text('x=%1.2f, y=%1.2f' % (x, y)) print('x=%1.2f, y=%1.2f' % (x, y)) plt.draw() t = np.arange(0.0, 1.0, 0.01) s = np.sin(2 * 2 * np.pi * t) fig, ax = plt.subplots() # cursor = Cursor(ax) cursor = SnaptoCursor(ax, t, s) plt.connect('motion_notify_event', cursor.mouse_move) ax.plot(t, s, 'o') plt.axis([0, 1, -1, 1]) plt.show() **Total running time of the script:** ( 0 minutes 0.000 seconds) .. only :: html .. container:: sphx-glr-footer .. container:: sphx-glr-download :download:`Download Python source code: cursor_demo_sgskip.py ` .. container:: sphx-glr-download :download:`Download Jupyter notebook: cursor_demo_sgskip.ipynb ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_