Selector de rectángulo persistente

Estoy tratando de desarrollar una tubería para procesar datos astronómicos. En algún momento, necesito dibujar un rectángulo sobre una imagen para seleccionar un área. Lo estoy haciendo usando matplotlib.widgets.RectangleSelector. Es muy conveniente para mí usarlo ya que es muy fácil de usar. El único “problema” que tengo es que el rectángulo que dibujé en el eje desaparece después de soltar el botón del mouse. ¿Hay alguna manera de hacerlo persistente? Quiero decir, ¿hay alguna forma en que pueda hacer que permanezca allí incluso una vez que suelte el botón?

Estoy usando los ejemplos de Matplotlib como referencia. http://matplotlib.org/examples/widgets/rectangle_selector.html

Actualización : Esto ya no es necesario. Usando la versión actual de matplotlib, 2.0.2, el ejemplo en la documentación persiste cuando se suelta el mouse.


El rectángulo desaparece porque el método de release de RectangleSelector llama

  # make the box/line invisible again self.to_draw.set_visible(False) self.canvas.draw() 

Para modificar este comportamiento, puede hacer una subclase de RectangleSelector y darle su propio método de release :

 class MyRectangleSelector(widgets.RectangleSelector): def release(self, event): super(MyRectangleSelector, self).release(event) self.to_draw.set_visible(True) self.canvas.draw() 

Así, aprovechando el ejemplo de la documentación ,

 from __future__ import print_function import matplotlib.widgets as widgets import numpy as np import matplotlib.pyplot as plt class MyRectangleSelector(widgets.RectangleSelector): def release(self, event): super(MyRectangleSelector, self).release(event) self.to_draw.set_visible(True) self.canvas.draw() 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 plotingrange 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 = MyRectangleSelector(current_ax, line_select_callback, drawtype='box', useblit=True, button=[1, 3], # don't use middle button minspanx=5, minspany=5, spancoords='pixels') plt.connect('key_press_event', toggle_selector) plt.show()