Mapa base de Matplotlib: caja emergente

Quiero saber cómo crear un cuadro emergente en un gráfico de mapa base. Cuando muevo el mouse sobre una ubicación, debería activar el cuadro emergente.

es posible?

Sí, es posible gracias al marco de gestión de eventos de matplotlib. No pude encontrar un ejemplo ya escrito que haga lo que te interesa especialmente, así que escribí uno (que presentaré para incluirlo en la fuente matplotlib).

Me gustaría leer http://matplotlib.sourceforge.net/users/event_handling.html para entender mejor lo que está sucediendo. Tenga en cuenta que, aunque suena como la solución perfecta, “pick_event” es para clics del mouse, no para eventos de mouse y no funciona en este caso.

Mi código, que podría ser objetivado muy bien si uno quisiera, se parece a:

import matplotlib.pyplot as plt fig = plt.figure() ax = plt.axes() points_with_annotation = [] for i in range(10): point, = plt.plot(i, i, 'o', markersize=10) annotation = ax.annotate("Mouseover point %s" % i, xy=(i, i), xycoords='data', xytext=(i + 1, i), textcoords='data', horizontalalignment="left", arrowprops=dict(arrowstyle="simple", connectionstyle="arc3,rad=-0.2"), bbox=dict(boxstyle="round", facecolor="w", edgecolor="0.5", alpha=0.9) ) # by default, disable the annotation visibility annotation.set_visible(False) points_with_annotation.append([point, annotation]) def on_move(event): visibility_changed = False for point, annotation in points_with_annotation: should_be_visible = (point.contains(event)[0] == True) if should_be_visible != annotation.get_visible(): visibility_changed = True annotation.set_visible(should_be_visible) if visibility_changed: plt.draw() on_move_id = fig.canvas.mpl_connect('motion_notify_event', on_move) plt.show() 

Esperemos que todo sea bastante legible. Un resumen de alto nivel del código va:

  • Cree una lista de [punto, anotación] pares, donde la anotación por defecto no es visible
  • Registre una función, “on_move”, para ser llamada cada vez que se detecte movimiento del mouse
  • La función on_move se itera a través de cada punto y anotación, si el mouse está ahora sobre uno de los puntos, haga visible su anotación asociada, si no lo está, hágala invisible. (El método contiene está documentado aquí )

Captura de pantalla del resultado.