Estoy usando matplotlib para hacer diagramas de dispersión. Cada punto en el diagrama de dispersión está asociado con un objeto con nombre. Me gustaría poder ver el nombre de un objeto cuando pase el cursor sobre el punto en el diagrama de dispersión asociado con ese objeto. En particular, sería bueno poder ver rápidamente los nombres de los puntos que son atípicos. Lo más cercano que pude encontrar mientras buscaba aquí es el comando de anotación, pero parece crear una etiqueta fija en la trama. Desafortunadamente, con la cantidad de puntos que tengo, el diagrama de dispersión sería ilegible si etiquetara cada punto. ¿Alguien sabe de una manera de crear etiquetas que solo aparecen cuando el cursor se encuentra cerca de ese punto?
python
matplotlib
jdmcbr
fuente
fuente
Respuestas:
Parece que ninguna de las otras respuestas aquí realmente responde a la pregunta. Entonces, aquí hay un código que usa una dispersión y muestra una anotación al pasar el mouse sobre los puntos de dispersión.
Debido a que las personas también quieren usar esta solución para una línea en
plot
lugar de una dispersión, la siguiente sería la misma soluciónplot
(que funciona de manera ligeramente diferente).Mostrar fragmento de código
En caso de que alguien esté buscando una solución para líneas en ejes gemelos, consulte ¿Cómo hacer que las etiquetas aparezcan al pasar el cursor sobre un punto en varios ejes?
En caso de que alguien esté buscando una solución para gráficos de barras, consulte, por ejemplo, esta respuesta .
fuente
ind["ind"]
realidad es una lista de índices para todos los puntos debajo del cursor. Esto significa que el código anterior realmente le da acceso a todos los puntos en una posición determinada, y no solo al punto más alto. Por ejemplo, si tiene dos puntos superpuestos, el texto podría leerse1 2, B C
o incluso1 2 3, B C D
si tuviera 3 puntos superpuestos.0 8, A I
(vea la imagen ).fig.canvas.draw_idle()
muchas veces (incluso cambia el cursor a inactivo). Lo resolví almacenando el índice anterior y comprobando siind["ind"][0] == prev_ind
. Luego, solo actualice si se mueve de un punto a otro (texto de actualización), deje de desplazarse (haga invisible la anotación) o comience a desplazarse (haga visible la anotación). Con este cambio, es mucho más limpio y eficiente.%matplotlib notebook
en un portátil IPython / Jupyter.Esta solución funciona al pasar el cursor sobre una línea sin necesidad de hacer clic en ella:
fuente
matplotlib
...), ¿funciona conipython
/jupyter
notebooks? ¿Funciona también cuando hay múltiples subtramas? ¿Qué pasa con un gráfico de barras en lugar de un gráfico de líneas?De http://matplotlib.sourceforge.net/examples/event_handling/pick_event_demo.html :
fuente
print
declaración también debe usar parens para compatibilidad con python 3Una pequeña edición de un ejemplo proporcionado en http://matplotlib.org/users/shell.html :
Esto traza una trama en línea recta, como Sohaib preguntaba
fuente
mpld3 resuélvelo por mí. EDITAR (CÓDIGO AGREGADO):
Puedes consultar este ejemplo
fuente
TypeError: array([1.]) is not JSON serializable
.mplcursors funcionó para mí. mplcursors proporciona anotaciones en las que se puede hacer clic para matplotlib. Está fuertemente inspirado en mpldatacursor ( https://github.com/joferkington/mpldatacursor ), con una API mucho más simplificada
fuente
matplotlib
hace que cada décima línea sea del mismo color, una pena.mplcursors
sin embargo lo resuelve.Las otras respuestas no respondieron a mi necesidad de mostrar correctamente información sobre herramientas en una versión reciente de la figura de Jupyter en línea matplotlib. Sin embargo, este funciona:
Llevando a algo como la siguiente imagen al pasar sobre un punto con el mouse:
fuente
Si usa jupyter notebook, mi solución es tan simple como:
Puedes conseguir algo como
fuente
He creado un sistema de anotación de varias líneas para agregar a: https://stackoverflow.com/a/47166787/10302020 . para la versión más actualizada: https://github.com/AidenBurgess/MultiAnnotationLineGraph
Simplemente cambie los datos en la sección inferior.
fuente