Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit b8874a6

Browse files
committed
added figure/axes enter/leave events
svn path=/trunk/matplotlib/; revision=6454
1 parent 063c379 commit b8874a6

3 files changed

Lines changed: 166 additions & 9 deletions

File tree

doc/users/event_handling.rst

Lines changed: 73 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -53,15 +53,19 @@ are sent back to you when the event occurs, and the event descriptions
5353
======================= ======================================================================================
5454
Event name Class and description
5555
======================= ======================================================================================
56-
'button_press_event' :class:`~matplotlib.backend_bases.MouseEvent` - mouse button is pressed
57-
'button_release_event' :class:`~matplotlib.backend_bases.MouseEvent` - mouse button is released
58-
'draw_event' :class:`~matplotlib.backend_bases.DrawEvent` - canvas draw
59-
'key_press_event' :class:`~matplotlib.backend_bases.KeyEvent` - key is pressed
60-
'key_release_event' :class:`~matplotlib.backend_bases.KeyEvent` - key is released
61-
'motion_notify_event' :class:`~matplotlib.backend_bases.MouseEvent` - mouse motion
62-
'pick_event' :class:`~matplotlib.backend_bases.PickEvent` - an object in the canvas is selected
63-
'resize_event' :class:`~matplotlib.backend_bases.ResizeEvent` - figure canvas is resized
64-
'scroll_event' :class:`~matplotlib.backend_bases.MouseEvent` - mouse scroll wheel is rolled
56+
'button_press_event' :class:`~matplotlib.backend_bases.MouseEvent` - mouse button is pressed
57+
'button_release_event' :class:`~matplotlib.backend_bases.MouseEvent` - mouse button is released
58+
'draw_event' :class:`~matplotlib.backend_bases.DrawEvent` - canvas draw
59+
'key_press_event' :class:`~matplotlib.backend_bases.KeyEvent` - key is pressed
60+
'key_release_event' :class:`~matplotlib.backend_bases.KeyEvent` - key is released
61+
'motion_notify_event' :class:`~matplotlib.backend_bases.MouseEvent` - mouse motion
62+
'pick_event' :class:`~matplotlib.backend_bases.PickEvent` - an object in the canvas is selected
63+
'resize_event' :class:`~matplotlib.backend_bases.ResizeEvent` - figure canvas is resized
64+
'scroll_event' :class:`~matplotlib.backend_bases.MouseEvent` - mouse scroll wheel is rolled
65+
'figure_enter_event' :class:`~matplotlib.backend_bases.LocationEvent` - mouse enters a new figure
66+
'figure_leave_event' :class:`~matplotlib.backend_bases.LocationEvent` - mouse leaves a figure
67+
'axes_enter_event' :class:`~matplotlib.backend_bases.LocationEvent` - mouse enters a new axes
68+
'axes_leave_event' :class:`~matplotlib.backend_bases.LocationEvent` - mouse leaves an axes
6569
======================= ======================================================================================
6670

6771
.. _event-attributes:
@@ -330,6 +334,66 @@ Extra credit solution::
330334
plt.show()
331335

332336

337+
.. _enter-leave-events:
338+
339+
Mouse enter and leave
340+
======================
341+
342+
If you want to be notified when the mouse enters or leaves a figure or
343+
axes, you can connect to the figure/axes enter/leave events. Here is
344+
a simple example that changes the colors of the axes and figure
345+
background that the mouse is over::
346+
347+
"""
348+
Illustrate the figure and axes enter and leave events by changing the
349+
frame colors on enter and leave
350+
"""
351+
import matplotlib.pyplot as plt
352+
353+
def enter_axes(event):
354+
print 'enter_axes', event.inaxes
355+
event.inaxes.patch.set_facecolor('yellow')
356+
event.canvas.draw()
357+
358+
def leave_axes(event):
359+
print 'leave_axes', event.inaxes
360+
event.inaxes.patch.set_facecolor('white')
361+
event.canvas.draw()
362+
363+
def enter_figure(event):
364+
print 'enter_figure', event.canvas.figure
365+
event.canvas.figure.patch.set_facecolor('red')
366+
event.canvas.draw()
367+
368+
def leave_figure(event):
369+
print 'leave_figure', event.canvas.figure
370+
event.canvas.figure.patch.set_facecolor('grey')
371+
event.canvas.draw()
372+
373+
fig1 = plt.figure()
374+
fig1.suptitle('mouse hover over figure or axes to trigger events')
375+
ax1 = fig1.add_subplot(211)
376+
ax2 = fig1.add_subplot(212)
377+
378+
fig1.canvas.mpl_connect('figure_enter_event', enter_figure)
379+
fig1.canvas.mpl_connect('figure_leave_event', leave_figure)
380+
fig1.canvas.mpl_connect('axes_enter_event', enter_axes)
381+
fig1.canvas.mpl_connect('axes_leave_event', leave_axes)
382+
383+
fig2 = plt.figure()
384+
fig2.suptitle('mouse hover over figure or axes to trigger events')
385+
ax1 = fig2.add_subplot(211)
386+
ax2 = fig2.add_subplot(212)
387+
388+
fig2.canvas.mpl_connect('figure_enter_event', enter_figure)
389+
fig2.canvas.mpl_connect('figure_leave_event', leave_figure)
390+
fig2.canvas.mpl_connect('axes_enter_event', enter_axes)
391+
fig2.canvas.mpl_connect('axes_leave_event', leave_axes)
392+
393+
plt.show()
394+
395+
396+
333397
.. _object-picking:
334398

335399
Object picking
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
"""
2+
Illustrate the figure and axes enter and leave events by changing the
3+
frame colors on enter and leave
4+
"""
5+
import matplotlib.pyplot as plt
6+
7+
def enter_axes(event):
8+
print 'enter_axes', event.inaxes
9+
event.inaxes.patch.set_facecolor('yellow')
10+
event.canvas.draw()
11+
12+
def leave_axes(event):
13+
print 'leave_axes', event.inaxes
14+
event.inaxes.patch.set_facecolor('white')
15+
event.canvas.draw()
16+
17+
def enter_figure(event):
18+
print 'enter_figure', event.canvas.figure
19+
event.canvas.figure.patch.set_facecolor('red')
20+
event.canvas.draw()
21+
22+
def leave_figure(event):
23+
print 'leave_figure', event.canvas.figure
24+
event.canvas.figure.patch.set_facecolor('grey')
25+
event.canvas.draw()
26+
27+
fig1 = plt.figure()
28+
fig1.suptitle('mouse hover over figure or axes to trigger events')
29+
ax1 = fig1.add_subplot(211)
30+
ax2 = fig1.add_subplot(212)
31+
32+
fig1.canvas.mpl_connect('figure_enter_event', enter_figure)
33+
fig1.canvas.mpl_connect('figure_leave_event', leave_figure)
34+
fig1.canvas.mpl_connect('axes_enter_event', enter_axes)
35+
fig1.canvas.mpl_connect('axes_leave_event', leave_axes)
36+
37+
fig2 = plt.figure()
38+
fig2.suptitle('mouse hover over figure or axes to trigger events')
39+
ax1 = fig2.add_subplot(211)
40+
ax2 = fig2.add_subplot(212)
41+
42+
fig2.canvas.mpl_connect('figure_enter_event', enter_figure)
43+
fig2.canvas.mpl_connect('figure_leave_event', leave_figure)
44+
fig2.canvas.mpl_connect('axes_enter_event', enter_axes)
45+
fig2.canvas.mpl_connect('axes_leave_event', leave_axes)
46+
47+
plt.show()
48+
49+

lib/matplotlib/backend_bases.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -743,6 +743,9 @@ class LocationEvent(Event):
743743
xdata = None # x coord of mouse in data coords
744744
ydata = None # y coord of mouse in data coords
745745

746+
# the last event that was triggered before this one
747+
_lastevent = None
748+
746749
def __init__(self, name, canvas, x, y,guiEvent=None):
747750
"""
748751
*x*, *y* in figure coords, 0,0 = bottom, left
@@ -751,15 +754,20 @@ def __init__(self, name, canvas, x, y,guiEvent=None):
751754
self.x = x
752755
self.y = y
753756

757+
758+
754759
if x is None or y is None:
755760
# cannot check if event was in axes if no x,y info
761+
self.inaxes = False
762+
self._update_enter_leave()
756763
return
757764

758765
# Find all axes containing the mouse
759766
axes_list = [a for a in self.canvas.figure.get_axes() if a.in_axes(self)]
760767

761768
if len(axes_list) == 0: # None found
762769
self.inaxes = None
770+
self._update_enter_leave()
763771
return
764772
elif (len(axes_list) > 1): # Overlap, get the highest zorder
765773
axCmp = lambda _x,_y: cmp(_x.zorder, _y.zorder)
@@ -777,6 +785,36 @@ def __init__(self, name, canvas, x, y,guiEvent=None):
777785
self.xdata = xdata
778786
self.ydata = ydata
779787

788+
self._update_enter_leave()
789+
790+
def _update_enter_leave(self):
791+
'process the figure/axes enter leave events'
792+
if LocationEvent._lastevent is not None:
793+
last = LocationEvent._lastevent
794+
if last.canvas!=self.canvas:
795+
# process figure enter/leave event
796+
last.canvas.callbacks.process('figure_leave_event', last)
797+
self.canvas.callbacks.process('figure_enter_event', self)
798+
if last.inaxes!=self.inaxes:
799+
# process axes enter/leave events
800+
if last.inaxes is not None:
801+
last.canvas.callbacks.process('axes_leave_event', last)
802+
if self.inaxes is not None:
803+
self.canvas.callbacks.process('axes_enter_event', self)
804+
805+
else:
806+
# process a figure enter event
807+
self.canvas.callbacks.process('figure_enter_event', self)
808+
# process an axes enter event if we are over an axes
809+
if self.inaxes is not None:
810+
self.canvas.callbacks.process('axes_enter_event', self)
811+
812+
813+
LocationEvent._lastevent = self
814+
815+
816+
817+
780818
class MouseEvent(LocationEvent):
781819
"""
782820
A mouse event ('button_press_event', 'button_release_event', 'scroll_event',
@@ -914,6 +952,12 @@ class FigureCanvasBase:
914952
'motion_notify_event',
915953
'pick_event',
916954
'idle_event',
955+
'figure_enter_event',
956+
# todo: we only process this when a mouse enters a different
957+
# figure -- we need to connect to the GUI leavel event
958+
'figure_leave_event',
959+
'axes_enter_event',
960+
'axes_leave_event'
917961
]
918962

919963

0 commit comments

Comments
 (0)