Skip to content

[MNT]: Deprecate onselect/onmove_callback of selectors #21929

@ericpre

Description

@ericpre

Summary

If I remember correctly, at some point, @anntzer suggested to deprecate onselect argument for selectors. Now, that I understand better what he meant at the time, I think it makes a lot of sense, because the behaviour of the "builtin" selector callback is contentious and inconsistent between selectors.

Proposed fix

The alternative would be something along the lines of:

import matplotlib.pyplot as plt
from matplotlib.widgets import RectangleSelector
import functools

_, ax = plt.subplots()
ax.plot([1, 2, 3])


def dummy_callback(*args):
    pass


def onselect_callback(event, selector):
    print('## onselect callback ##')
    if not selector.ignore(event):
        print('   ', selector.extents)
        return
    print('   event ignored')


def onmove_callback(event, selector):
    print('## onmove callback ##')
    if not selector.ignore(event) and selector._eventpress:
        print('   ', selector.extents)
        return
    print('   event ignored')


tool = RectangleSelector(ax, dummy_callback, interactive=True,
                         drag_from_anywhere=True,)
tool.extents = (1.2, 2.0, 1.0, 1.6)

# alternative to onselect
rectangle_onselect_callback = functools.partial(onselect_callback, selector=tool)
tool.connect_event('button_release_event', rectangle_onselect_callback)

# alternative to onmove_callback (SpanSelector only)
rectangle_onmove_callback = functools.partial(onmove_callback, selector=tool)
tool.connect_event('motion_notify_event', rectangle_onmove_callback)

In my opinion, the reasons to deprecate are:

Proposed fix:

  • Deprecate the onselect/onmove arguments of the selectors, as per example above
  • improve the API to ignore events (the example above uses a private API to reproduce the onmove_callback of the SpanSelector)
  • update example, improve documentation on the use of callback registry.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions