mpldatacursor icon indicating copy to clipboard operation
mpldatacursor copied to clipboard

Its works like a charm over Jupyter Notebooks

Open malliwi88 opened this issue 8 years ago • 5 comments

Hello @joferkington

I'm thinking if is possible mixes or embedded this class or its configurations on your library mpldatacursor because the code below works perfectly with %matplotlib notebook, unlike mpldatacursor doesn't work on jupyter notebook.

What do you think about this?

from matplotlib import cbook

class DataCursor(object):
    """A simple data cursor widget that displays the x,y location of a
    matplotlib artist when it is selected."""
    def __init__(self, artists, tolerance=5, offsets=(-20, 20), 
                 template='x: %0.2f\ny: %0.2f', display_all=False):
        """Create the data cursor and connect it to the relevant figure.
        "artists" is the matplotlib artist or sequence of artists that will be 
            selected. 
        "tolerance" is the radius (in points) that the mouse click must be
            within to select the artist.
        "offsets" is a tuple of (x,y) offsets in points from the selected
            point to the displayed annotation box
        "template" is the format string to be used. Note: For compatibility
            with older versions of python, this uses the old-style (%) 
            formatting specification.
        "display_all" controls whether more than one annotation box will
            be shown if there are multiple axes.  Only one will be shown
            per-axis, regardless. 
        """
        self.template = template
        self.offsets = offsets
        self.display_all = display_all
        if not cbook.iterable(artists):
            artists = [artists]
        self.artists = artists
        self.axes = tuple(set(art.axes for art in self.artists))
        self.figures = tuple(set(ax.figure for ax in self.axes))

        self.annotations = {}
        for ax in self.axes:
            self.annotations[ax] = self.annotate(ax)

        for artist in self.artists:
            artist.set_picker(tolerance)
        for fig in self.figures:
            fig.canvas.mpl_connect('pick_event', self)

    def annotate(self, ax):
        """Draws and hides the annotation box for the given axis "ax"."""
        annotation = ax.annotate(self.template, xy=(0, 0), ha='right',
                xytext=self.offsets, textcoords='offset points', va='bottom',
                bbox=dict(boxstyle='round,pad=0.5', fc='yellow', alpha=0.5),
                arrowprops=dict(arrowstyle='->', connectionstyle='arc3,rad=0')
                )
        annotation.set_visible(False)
        return annotation

    def __call__(self, event):
        """Intended to be called through "mpl_connect"."""
        # Rather than trying to interpolate, just display the clicked coords
        # This will only be called if it's within "tolerance", anyway.
        x, y = event.mouseevent.xdata, event.mouseevent.ydata
        annotation = self.annotations[event.artist.axes]
        if x is not None:
            if not self.display_all:
                # Hide any other annotation boxes...
                for ann in self.annotations.values():
                    ann.set_visible(False)
            # Update the annotation in the current axis..
            annotation.xy = x, y
            annotation.set_text(self.template % (x, y))
            annotation.set_visible(True)
            event.canvas.draw()

if __name__ == '__main__':
    import matplotlib.pyplot as plt
    plt.figure()
    plt.subplot(2,1,1)
    line1, = plt.plot(range(10), 'ro-')
    plt.subplot(2,1,2)
    line2, = plt.plot(range(10), 'bo-')

    DataCursor([line1, line2])

    plt.show()

source:

  • http://stackoverflow.com/questions/4652439/is-there-a-matplotlib-equivalent-of-matlabs-datacursormode

malliwi88 avatar Dec 26 '16 15:12 malliwi88

what about datacursor does not work in the notebook?

tacaswell avatar Jan 03 '17 22:01 tacaswell

datacursor works in Notebook, as far as I could see. But keyboard shortcuts seems to be not working (in particular shift + LEFT/RIGHT which is super useful :/

Phyks avatar Mar 29 '17 09:03 Phyks

Keyboard input should work in the notebook backend...

tacaswell avatar Apr 03 '17 01:04 tacaswell

Indeed, d keyboard input works. But Shift+arrow keyboard shortcut does not work. Not sure, but it could be conflicting with a Jupyter Notebook shortcut (although d is also a default Jupyter notebook shortcut and is working), or maybe it has something to do with the fact that it is running in browser and then, the shift modifier might not be passed along?

Phyks avatar Apr 06 '17 07:04 Phyks

That is likely an issue with the js layer...

tacaswell avatar Apr 13 '17 15:04 tacaswell