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?Cómo crear una leyenda arrastrable en matplotlib?
Respuesta
Nota: Esto ahora está integrado en matplotlib
leg = plt.legend()
if leg:
leg.draggable()
funcionará como se espera
Bueno, he encontrado fragmentos de la solución esparcieron entre las listas de distribución. Yo he llegado con un buen trozo de código modular que se puede soltar 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 su 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.
En Jue 28 Ene 2010 a las 15:02, Adam Fraser escribió:
pensé que me gustaría compartir una solución al problema de la leyenda se puede arrastrar desde me tomó por siempre para asimilar todo el conocimiento disperso en las listas de correo ...
Genial ejemplo. Agregué el código a legend.py. Ahora usted puede hacer
pierna = ax.legend()
leg.draggable()para habilitar el modo que pueden arrastrarse. Puede llamar repetidamente a este func para alternar el estado que se puede arrastrar.
Espero que esto sea útil para las personas que trabajan con matplotlib.
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á utilizando 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)
- 1. ¿Cómo crear una leyenda para la barra 3D en matplotlib?
- 2. Eliminar la leyenda en una figura matplotlib
- 3. matplotlib - Leyenda en subtrama separada
- 4. ¿cómo hago una sola leyenda para muchas subtramas con matplotlib?
- 5. Creación de una leyenda de mapa de color en Matplotlib
- 6. Alineación de texto en una leyenda de Matplotlib
- 7. ¿Cómo se dibuja un rectángulo en la leyenda en matplotlib?
- 8. Matplotlib, leyenda con múltiples marcadores diferentes con una etiqueta
- 9. Swing: ¿Crear un componente arrastrable ...?
- 10. Matplotlib savefig con una leyenda fuera de la trama
- 11. ¿Cómo puedo crear una interfaz para matplotlib?
- 12. ¿Cómo se crea una leyenda para una trama de contorno en matplotlib?
- 13. jQuery UI - cómo restaurar el arrastrable arrastrable
- 14. matplotlib - Global leyenda y el título de lado subtramas
- 15. Establecer la opacidad del símbolo de la leyenda con matplotlib?
- 16. leyenda de matplotlib que muestra barras de error dobles
- 17. Cómo crear un cursor de mouse personalizado en Matplotlib
- 18. Leyenda de Matplotlib, agregue elementos en columnas en lugar de hacia abajo
- 19. Cómo mover o colocar una leyenda en ggplot2
- 20. ¿Cómo dibujar una línea entre arrastrable y desplegable?
- 21. ¿Cómo actualizar una parcela en matplotlib?
- 22. Hacer una leyenda/clave en GraphViz
- 23. eliminando una leyenda de capa en ggplot
- 24. Se está cortando mi leyenda matplotlib.pyplot
- 25. aumentar el ancho de línea de las líneas de leyenda en matplotlib
- 26. jQuery UI Arrastrable, Ajustar a una cuadrícula
- 27. jQuery UI - ¿Arrastrable no es una función?
- 28. jQuery seleccionable y arrastrable para crear una ventana similar al Explorador de Windows
- 29. jQuery UI Constelación arrastrable
- 30. Jquery-ui Arrastrable y dinámico Jquery-ui arrastrable?
Adam: dado que este era sustancial, completa y suficientemente relevante para incluir en la distribución Matplotlib, y dado que (creo) que retiró su pregunta original, ¿le importaría que incluye un par de frases en la parte superior de esta Q para que los usuarios puedan hacerse una idea de para qué sirve este código (para evitar que tengan que leer el código en sí). Y buen trabajo, por cierto +1 de mi parte. – doug
Gracias doug. Formulé la pregunta en la parte superior como sugirió. Espero que esto sea útil. :] –
¿se puede extender esto para el eje secundario? – denfromufa