python - legends - ¿Cómo crear una leyenda arrastrable en matplotlib?
python matplotlib legend font size (2)
En las versiones más nuevas de Matplotlib (v1.0.1), esto está incorporado.
def draw(self):
ax = self.figure.add_subplot(111)
scatter = ax.scatter(np.random.randn(100), np.random.randn(100))
legend = ax.legend()
legend.draggable(state=True)
Si está usando matplotlib de forma interactiva (por ejemplo, en el modo pylab de IPython).
plot(range(10), range(10), label="test label")
plot(range(10), [5 for x in range(10)], label="another test")
l = legend()
l.draggable(True)
Estoy dibujando una leyenda sobre un objeto de ejes en matplotlib, pero el posicionamiento predeterminado que dice colocarlo en un lugar inteligente no parece funcionar. Idealmente, me gustaría que la leyenda sea arrastrable por el usuario. ¿Cómo puede hacerse esto?
Nota: Esto ahora está integrado en matplotlib
leg = plt.legend()
if leg:
leg.draggable()
funcionará como se esperaba
Bueno, encontré partes de la solución dispersas entre las listas de correo. He creado un buen fragmento modular de código que puedes usar y usar ... aquí está:
class DraggableLegend:
def __init__(self, legend):
self.legend = legend
self.gotLegend = False
legend.figure.canvas.mpl_connect(''motion_notify_event'', self.on_motion)
legend.figure.canvas.mpl_connect(''pick_event'', self.on_pick)
legend.figure.canvas.mpl_connect(''button_release_event'', self.on_release)
legend.set_picker(self.my_legend_picker)
def on_motion(self, evt):
if self.gotLegend:
dx = evt.x - self.mouse_x
dy = evt.y - self.mouse_y
loc_in_canvas = self.legend_x + dx, self.legend_y + dy
loc_in_norm_axes = self.legend.parent.transAxes.inverted().transform_point(loc_in_canvas)
self.legend._loc = tuple(loc_in_norm_axes)
self.legend.figure.canvas.draw()
def my_legend_picker(self, legend, evt):
return self.legend.legendPatch.contains(evt)
def on_pick(self, evt):
if evt.artist == self.legend:
bbox = self.legend.get_window_extent()
self.mouse_x = evt.mouseevent.x
self.mouse_y = evt.mouseevent.y
self.legend_x = bbox.xmin
self.legend_y = bbox.ymin
self.gotLegend = 1
def on_release(self, event):
if self.gotLegend:
self.gotLegend = False
... y en tu código ...
def draw(self):
ax = self.figure.add_subplot(111)
scatter = ax.scatter(np.random.randn(100), np.random.randn(100))
legend = DraggableLegend(ax.legend())
Envié un correo electrónico al grupo de usuarios de Matplotlib y John Hunter tuvo la amabilidad de agregar mi solución a SVN HEAD.
El Jueves, 28 de enero de 2010 a las 3:02 PM, Adam Fraser escribió:
Pensé que compartiría una solución al problema de la leyenda arrastrable, ya que me llevó una eternidad asimilar todo el conocimiento disperso en las listas de correo ...
Genial - buen ejemplo. Agregué el código a legend.py Ahora puedes hacer
leg = ax.legend ()
leg.draggable ()para habilitar el modo arrastrable. Puede llamar repetidamente a esta función para alternar entre el estado arrastrable.
Espero que esto sea útil para las personas que trabajan con matplotlib.