Skip to main content

A tiny library for simple and convenient matplotlib event handling

Project description

mpl-events

PyPI version Build status Docs status License

mpl-events is a tiny library for simple and convenient matplotlib event handling with minimum boilerplate code. In other words, the library provides high-level API for using matplotlib event system.

You need to handling matplotlib events if you want to manipulate figures and plots/visualizations interactively. Matplotlib contains a low-level API for event handling: using FigureCanvasBase.mpl_connect and FigureCanvasBase.mpl_disconnect methods, string-based event names and integer connection identifiers.

Pros and cons

Pros:

  • mpl-events provides high-level API, auto disconnecting and cleanup
  • Strings-based event types/names are not used. Intstead, MplEvent enum class is used for all event types.
  • Integer connection identifiers are not used. Instead, the connection between event and handler is incapsulated via class MplEventConnection
  • mpl-events objects do not own mpl figure and do not create additional references to figure or canvas
  • mpl-events provides convenient base class MplEventDispatcher that contains handlers API (with type-hints) for handling all mpl events inside one class without boilerplate code

Cons:

  • Additional level of abstraction (if this can be considered a disadvantage)
  • Additional dependency in your project

Installation

Supported Python versions

You can use pip to install mpl-events:

pip install mpl-events

or from github repo:

pip install git+https://github.com/espdev/mpl-events.git

Usage

Event dispatchers

Custom event dispatcher class might be created to handle some matplotlib events just inheriting MplEventDispatcher class and implementing the required event handlers.

The following example shows how we can create the dispatcher for handling all mouse events:

from matplotlib import pyplot as plt
from mpl_events import MplEventDispatcher, mpl

class MouseEventDispatcher(MplEventDispatcher):

    def on_mouse_button_press(self, event: mpl.MouseEvent):
        print(f'mouse button {event.button} pressed')

    def on_mouse_button_release(self, event: mpl.MouseEvent):
        print(f'mouse button {event.button} released')

    def on_mouse_move(self, event: mpl.MouseEvent):
        print(f'mouse moved')

    def on_mouse_wheel_scroll(self, event: mpl.MouseEvent):
        print(f'mouse wheel scroll {event.step}')

figure = plt.figure()

# setup figure and make plots is here ...

mouse_dispatcher = MouseEventDispatcher(figure)

plt.show()

MplEventDispatcher class provides API (handler methods interface) for all matplotlib events. You may override and implement some of these methods for handling corresponding events.

The dispatcher might be connected to a canvas using mpl objects figure or axes (or canvas). In general, we do not need to think about it. We just pass figure instance to constructor usually. By default connection to events is made automatically. This behavior is controlled by connect argument.

And it is all. We do not need to worry about connecting/disconnecting or remember mpl event names.

If we want to use another methods (not MplEventDispatcher API) for handling events we can use mpl_event_handler decorator inside our dispatcher class.

from mpl_events import MplEventDispatcher, MplEvent, mpl_event_handler, mpl

class CloseEventDispatcher(MplEventDispatcher):

    @mpl_event_handler(MplEvent.FIGURE_CLOSE)
    def _close_event_handler(self, event: mpl.CloseEvent):
        print(f'figure {event.canvas.figure} closing')

Also we can create event dispatchers hierarchies:

from mpl_events import MplEventDispatcher, mpl

class MyEventDispatcherBase(MplEventDispatcher):
    def on_figure_close(self, event: mpl.CloseEvent):
        print('figure closing from MyEventDispatcherBase')

class MyEventDispatcher(MyEventDispatcherBase):

    def on_figure_close(self, event: mpl.CloseEvent):
        super().on_figure_close(event)
        print('figure closing from MyEventDispatcher')

    def on_figure_resize(self, event: mpl.ResizeEvent):
        print('figure resizing')

Event connections

The connection between event and handler incapsulated in MplEventConnection class. This class is high level wrapper for figure.canvas.mpl_connect/figure.canvas.mpl_disconnect mpl API.

MplEventConnection can be used if we want to handle events and do not use event dispatcher interface.

In this case we just create instance of MplEventConnection class and pass to constructor mpl object for connecting (figure, axes or canvas), event type as MplEvent enum and handler as callable. By default connection is made automatically. This behavior is controlled by connect argument.

from matplotlib import pyplot as plt
from mpl_events import MplEventConnection, MplEvent, mpl

def close_handler(event: mpl.CloseEvent):
    print('figure closing')

figure = plt.figure()

conn = MplEventConnection(figure, MplEvent.FIGURE_CLOSE, close_handler)

print(conn)
# MplEventConnection(event=<FIGURE_CLOSE:close_event>, handler=<function close_handler at 0x0000013FD1002E18>, id=5)

plt.show()

Also we can use the shortcut for MplEventConnection constuction using make_connection method of MplEvent class:

from mpl_events import MplEvent

...

conn = MplEvent.FIGURE_CLOSE.make_connection(figure, close_handler)

Disable default key press event handler

Matplotlib figures usually contain navigation bar for some interactions with axes and this navigation bar handles key presses. By default key press handler is connected in FigureManagerBase mpl class. mpl-events provides disable_default_key_press_handler function to disconnect the default key press handler. Also in event dispatcher classes we can use disable_default_handlers attribute.

Here is a simple example:

from matplotlib import pyplot as plt
from mpl_events import MplEventDispatcher, mpl

class KeyEventDispatcher(MplEventDispatcher):
    disable_default_handlers = True

    def on_key_press(self, event: mpl.KeyEvent):
        print(f'Pressed key {event.key}')

    def on_key_release(self, event: mpl.KeyEvent):
        print(f'Released key {event.key}')

figure = plt.figure()

dispatcher = KeyEventDispatcher(figure)

plt.show()

Testing

We use pytest and tox for testing.

Documentation

Please see the latest documentation.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mpl-events-0.1.0.tar.gz (9.3 kB view details)

Uploaded Source

Built Distribution

mpl_events-0.1.0-py3-none-any.whl (11.3 kB view details)

Uploaded Python 3

File details

Details for the file mpl-events-0.1.0.tar.gz.

File metadata

  • Download URL: mpl-events-0.1.0.tar.gz
  • Upload date:
  • Size: 9.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.0.1 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.6.6

File hashes

Hashes for mpl-events-0.1.0.tar.gz
Algorithm Hash digest
SHA256 62a652461a8a44f6c647a8cb8adc00074cac98e49726fac149931b84a687b4f3
MD5 3ba8a1d7b7da34a1cb5dfa97259c3635
BLAKE2b-256 ba1b513ce5a15b35868f0cbc6706f5dbd5e956d241b2b275d897c268ff3c1c80

See more details on using hashes here.

File details

Details for the file mpl_events-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: mpl_events-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 11.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.0.1 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.6.6

File hashes

Hashes for mpl_events-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 010cc577752c680a9f65828ed3a345c8dc66c12f19a01ecd0b2852286e9d78a6
MD5 529a6b05f42c90dd10a61e9f2af05b9e
BLAKE2b-256 f49da08191175086afe85d2cc40bec7ea48173a69326b8b4742317c324c48ff3

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page