diff --git a/doc/users/next_whats_new/2017-11-24_figurecanvas_inaxes.rst b/doc/users/next_whats_new/2017-11-24_figurecanvas_inaxes.rst new file mode 100644 index 000000000000..6de6f8a7740d --- /dev/null +++ b/doc/users/next_whats_new/2017-11-24_figurecanvas_inaxes.rst @@ -0,0 +1,6 @@ + +Add ``inaxes`` method to FigureCanvas +------------------------------------------------------------- + +The `FigureCanvas` class has now an ``inaxes`` method to check whether a point is in an axes +and returns the topmost axes, else None. diff --git a/lib/matplotlib/backend_bases.py b/lib/matplotlib/backend_bases.py index 7fec6081f405..a8d546003158 100644 --- a/lib/matplotlib/backend_bases.py +++ b/lib/matplotlib/backend_bases.py @@ -1496,15 +1496,12 @@ def __init__(self, name, canvas, x, y, guiEvent=None): self._update_enter_leave() return - # Find all axes containing the mouse if self.canvas.mouse_grabber is None: - axes_list = [a for a in self.canvas.figure.get_axes() - if a.in_axes(self)] + self.inaxes = self.canvas.inaxes((x, y)) else: - axes_list = [self.canvas.mouse_grabber] + self.inaxes = self.canvas.mouse_grabber - if axes_list: - self.inaxes = cbook._topmost_artist(axes_list) + if self.inaxes is not None: try: trans = self.inaxes.transData.inverted() xdata, ydata = trans.transform_point((x, y)) @@ -1514,8 +1511,6 @@ def __init__(self, name, canvas, x, y, guiEvent=None): else: self.xdata = xdata self.ydata = ydata - else: - self.inaxes = None self._update_enter_leave() @@ -1993,6 +1988,39 @@ def enter_notify_event(self, guiEvent=None, xy=None): event = LocationEvent('figure_enter_event', self, x, y, guiEvent) self.callbacks.process('figure_enter_event', event) + @cbook.deprecated("2.1") + def idle_event(self, guiEvent=None): + """Called when GUI is idle.""" + s = 'idle_event' + event = IdleEvent(s, self, guiEvent=guiEvent) + self.callbacks.process(s, event) + + def inaxes(self, xy): + """ + Check if a point is in an axes. + + Parameters + ---------- + xy : tuple or list + (x,y) coordinates. + x position - pixels from left of canvas. + y position - pixels from bottom of canvas. + + Returns + ------- + axes: topmost axes containing the point, or None if no axes. + + """ + axes_list = [a for a in self.figure.get_axes() + if a.patch.contains_point(xy)] + + if axes_list: + axes = cbook._topmost_artist(axes_list) + else: + axes = None + + return axes + def grab_mouse(self, ax): """ Set the child axes which are currently grabbing the mouse events.