.. note::
    :class: sphx-glr-download-link-note

    Click :ref:`here <sphx_glr_download_gallery_widgets_rectangle_selector.py>` to download the full example code
.. rst-class:: sphx-glr-example-title

.. _sphx_glr_gallery_widgets_rectangle_selector.py:


==================
Rectangle Selector
==================

Do a mouseclick somewhere, move the mouse to some destination, release
the button.  This class gives click- and release-events and also draws
a line or a box from the click-point to the actual mouseposition
(within the same axes) until the button is released.  Within the
method 'self.ignore()' it is checked whether the button from eventpress
and eventrelease are the same.




.. image:: /gallery/widgets/images/sphx_glr_rectangle_selector_001.png
    :class: sphx-glr-single-img


.. rst-class:: sphx-glr-script-out

 Out:

 .. code-block:: none

    click  -->  release




|


.. code-block:: python

    from matplotlib.widgets import RectangleSelector
    import numpy as np
    import matplotlib.pyplot as plt


    def line_select_callback(eclick, erelease):
        'eclick and erelease are the press and release events'
        x1, y1 = eclick.xdata, eclick.ydata
        x2, y2 = erelease.xdata, erelease.ydata
        print("(%3.2f, %3.2f) --> (%3.2f, %3.2f)" % (x1, y1, x2, y2))
        print(" The button you used were: %s %s" % (eclick.button, erelease.button))


    def toggle_selector(event):
        print(' Key pressed.')
        if event.key in ['Q', 'q'] and toggle_selector.RS.active:
            print(' RectangleSelector deactivated.')
            toggle_selector.RS.set_active(False)
        if event.key in ['A', 'a'] and not toggle_selector.RS.active:
            print(' RectangleSelector activated.')
            toggle_selector.RS.set_active(True)


    fig, current_ax = plt.subplots()                 # make a new plotting range
    N = 100000                                       # If N is large one can see
    x = np.linspace(0.0, 10.0, N)                    # improvement by use blitting!

    plt.plot(x, +np.sin(.2*np.pi*x), lw=3.5, c='b', alpha=.7)  # plot something
    plt.plot(x, +np.cos(.2*np.pi*x), lw=3.5, c='r', alpha=.5)
    plt.plot(x, -np.sin(.2*np.pi*x), lw=3.5, c='g', alpha=.3)

    print("\n      click  -->  release")

    # drawtype is 'box' or 'line' or 'none'
    toggle_selector.RS = RectangleSelector(current_ax, line_select_callback,
                                           drawtype='box', useblit=True,
                                           button=[1, 3],  # don't use middle button
                                           minspanx=5, minspany=5,
                                           spancoords='pixels',
                                           interactive=True)
    plt.connect('key_press_event', toggle_selector)
    plt.show()


.. _sphx_glr_download_gallery_widgets_rectangle_selector.py:


.. only :: html

 .. container:: sphx-glr-footer
    :class: sphx-glr-footer-example



  .. container:: sphx-glr-download

     :download:`Download Python source code: rectangle_selector.py <rectangle_selector.py>`



  .. container:: sphx-glr-download

     :download:`Download Jupyter notebook: rectangle_selector.ipynb <rectangle_selector.ipynb>`


.. only:: html

 .. rst-class:: sphx-glr-signature

    Keywords: matplotlib code example, codex, python plot, pyplot
    `Gallery generated by Sphinx-Gallery
    <https://sphinx-gallery.readthedocs.io>`_
