• Saltar al contenido principal
  • Skip to secondary menu
  • Saltar a la barra lateral principal
  • Saltar al pie de página
  • Inicio
  • Secciones
    • Ciencia de datos
    • Criptografía
    • Herramientas
    • Machine Learning
    • Noticias
    • Opinión
    • Productividad
    • Programación
      • JavaScript
      • Julia
      • Matlab
      • Python
      • R
  • Programación
    • JavaScript
    • Julia
    • Matlab
    • Python
    • R
  • Laboratorio
    • Encuestas: Tamaño de Muestra
    • Lotería: Probabilidad de Ganar
    • Reparto de Escaños (D’Hondt)
    • Tres en Raya con IA
  • Noticias
  • Boletín
  • Contacto
  • Tienda
    • Libros
    • Equipamiento de oficina
    • Equipamiento en movilidad
    • Tiendas afiliadas
      • AliExpress
      • Amazon
      • Banggood
      • GeekBuying
      • Lenovo

Analytics Lane

Ciencia e ingeniería de datos aplicada

  • Ciencia de datos
  • Machine Learning
  • IA Generativa
  • Python
  • Pandas
  • NumPy
  • R
  • Excel

Anotaciones dinámicas en Matplotlib: Cómo usar mplcursors para destacar puntos clave al mover el cursor

enero 20, 2025 Por Daniel Rodríguez Deja un comentario
Tiempo de lectura: 8 minutos

Incluir anotaciones en gráficos es fundamental para resaltar la información relevante, especialmente al analizar grandes volúmenes de datos o cuando la interpretación de estos no es inmediata. Sin embargo, un exceso de anotaciones estáticas puede saturar los gráficos y dificultar su lectura. Por ejemplo, en un gráfico de dispersión con cientos de puntos, añadir etiquetas para cada uno generaría confusión en lugar de claridad. Una solución eficaz a este problema es implementar anotaciones dinámicas, que solo se muestran cuando el usuario pasa el cursor sobre los elementos del gráfico. Este enfoque permite interactuar con los datos, enfocarse en puntos específicos y explorar información adicional de forma eficiente y limpia.

En Python, la biblioteca mplcursors simplifica la creación de gráficos con anotaciones dinámicas en Matplotlib. A continuación, se mostrará cómo integrar la biblioteca en proyectos para mejorar la interactividad y la utilidad de las visualizaciones.

Tabla de contenidos

  • 1 Introducción a la biblioteca mplcursors
    • 1.1 Instalación de mplcursors
    • 1.2 Configuración en entornos interactivos como Jupyter Notebook
  • 2 Configuración básica de mplcursors
    • 2.1 Personalización de anotaciones: Incorporando etiquetas personalizadas
    • 2.2 Gráfico de líneas con anotaciones dinámicas
    • 2.3 Gráfico de barras con cálculos adicionales
  • 3 Consejos para usar mplcursors de manera efectiva
  • 4 Conclusiones

Introducción a la biblioteca mplcursors

mplcursors es una biblioteca ligera diseñada para trabajar con gráficos de Matplotlib. Su principal objetivo es proporcionar una forma intuitiva de agregar anotaciones dinámicas que se activan al interactuar con los gráficos mediante el cursor. Estas anotaciones pueden incluir:

  • Coordenadas exactas de los puntos.
  • Etiquetas personalizadas.
  • Detalles adicionales calculados a partir de los datos, como valores derivados o estadísticas.

Publicidad


Instalación de mplcursors

Para instalar la biblioteca, se puede recurrir al gestor de paquetes pip. Simplemente se debe ejecutar el siguiente comando en una terminal:

Programador de tareas de Windows: Guía definitiva para automatizar tu trabajo (BAT, PowerShell y Python)
En Analytics Lane
Programador de tareas de Windows: Guía definitiva para automatizar tu trabajo (BAT, PowerShell y Python)

pip install mplcursors

Una vez instalada, se puede integrar fácilmente en los scripts o notebooks de Python.

Configuración en entornos interactivos como Jupyter Notebook

Si se está trabajando en Jupyter Notebook o entornos similares, es necesario habilitar un backend interactivo compatible para que funcionen las anotaciones. Esto se puede hacer mediante el comando mágico %matplotlib widget. Lo que asegura que los gráficos generados sean interactivos y que las anotaciones dinámicas funcionen correctamente. Sin este paso, las características interactivas de mplcursors no estarán disponibles en el Notebook.

Publicidad


Configuración básica de mplcursors

Para usar mplcursors, el primer paso es crear un gráfico en Matplotlib y habilitar las anotaciones dinámicas. Aquí se muestra un ejemplo práctico:

import matplotlib.pyplot as plt
import numpy as np
import mplcursors

# Datos de ejemplo
np.random.seed(42)
x = np.random.rand(50)
y = np.random.rand(50)

# Crear un gráfico de dispersión
plt.scatter(x, y, color='blue", alpha=0.7)
plt.title("Gráfico de Dispersión con Anotaciones Dinámicas")
plt.xlabel("Eje X")
plt.ylabel("Eje Y")

# Habilitar anotaciones dinámicas con mplcursors
cursor = mplcursors.cursor(hover=True)

# Mostrar el gráfico
plt.show()
Gráfico de dispersión mostrando anotaciones dinámicas básicas
Gráfico de dispersión con anotaciones dinámicas

Lo que hace este código es:

  1. Creación del gráfico de dispersión:
    • Se usa plt.scatter para crear un gráfico de dispersión con datos aleatorios.
    • A continuación, se incluyen etiquetas y un título para mejorar la claridad del gráfico.
  2. Activación de las anotaciones dinámicas:
    • La línea cursor = mplcursors.cursor(hover=True) activa las anotaciones dinámicas.
    • El parámetro hover=True permite que las anotaciones aparecen al pasar el cursor sobre los puntos del gráfico, eliminando la necesidad de hacer clic para interactuar.
  3. Anotaciones por defecto:
    • Inicialmente, las anotaciones muestran las coordenadas (X, Y) de cada punto seleccionado.
    • Más adelante, estas anotaciones se pueden personalizar para incluir información adicional, como etiquetas personalizadas o cálculos derivados.

Este enfoque básico proporciona una base sólida para integrar anotaciones dinámicas en los gráficos. En las próximas secciones, se explorará cómo personalizar estas anotaciones para adaptarlas a necesidades específicas.

Personalización de anotaciones: Incorporando etiquetas personalizadas

Con mplcursors, se puede modificar las anotaciones para incluir información específica, como etiquetas descriptivas, identificadores o valores adicionales. Esto es especialmente útil en gráficos complejos donde cada punto representa un dato significativo. Esto es lo que se hace en el siguiente ejemplo;

import matplotlib.pyplot as plt
import numpy as np
import mplcursors

# Datos de ejemplo con etiquetas
np.random.seed(42)
x = np.random.rand(10)
y = np.random.rand(10)
labels = [f"Punto {i}" for i in range(len(x))]

# Crear un gráfico de dispersión
fig, ax = plt.subplots(figsize=(8, 6))
scatter = ax.scatter(x, y, color='green', alpha=0.7, edgecolor='black')
ax.set_title("Anotaciones Personalizadas con Etiquetas", fontsize=14)
ax.set_xlabel("Eje X", fontsize=12)
ax.set_ylabel("Eje Y", fontsize=12)
ax.grid(True, linestyle="--", alpha=0.5)

# Habilitar anotaciones dinámicas con etiquetas personalizadas
cursor = mplcursors.cursor(scatter, hover=True)

@cursor.connect("add")
def on_add(sel):
    # Establecer texto personalizado
    sel.annotation.set_text(labels[sel.index])
    # Personalizar el fondo de la anotación
    sel.annotation.get_bbox_patch().set_facecolor("yellow")
    sel.annotation.get_bbox_patch().set_alpha(0.8)

plt.show()
Gráfico de dispersión mostrando anotaciones dinámicas personalizadas
Gráfico de dispersión con anotaciones dinámicas personalizadas

Lo que hace este código es:

  1. Generación de etiquetas personalizadas:
    • La lista labels contiene las descripciones de cada punto, generadas dinámicamente en función de su índice.
  2. Configuración del evento add:
    • La función on_add se ejecuta cada vez que el cursor selecciona un punto.
    • sel.annotation.set_text(): Cambia el texto de la anotación para mostrar la etiqueta correspondiente al índice del punto.
    • get_bbox_patch(): Personaliza el fondo de la anotación, incluyendo color y transparencia.
  3. Estilización del gráfico:
    • El gráfico incluye bordes en los puntos (edgecolor) y una cuadrícula para mejorar su legibilidad.

En la figura resultante, cuando se pase el cursor sobre un punto, aparecerá una anotación que muestra la etiqueta correspondiente, con un fondo amarillo semitransparente. Esta configuración hace que las anotaciones sean más visibles y útiles, especialmente en gráficos con múltiples puntos.

Publicidad


Gráfico de líneas con anotaciones dinámicas

Las anotaciones dinámicas no se limitan a gráficos de dispersión; también se pueden aplicar a gráficos de líneas para resaltar información en puntos específicos. Algo que es particularmente útil en análisis de series temporales o funciones matemáticas. Un ejemplo básico donde se agregan anotaciones dinámicas en un gráfico de líneas podría ser el siguiente:

import matplotlib.pyplot as plt
import numpy as np
import mplcursors

# Datos de ejemplo para un gráfico de líneas
x = np.linspace(0, 10, 100)
y = np.sin(x)

# Crear un gráfico de líneas
fig, ax = plt.subplots(figsize=(8, 6))
line, = ax.plot(x, y, label="Seno", color="purple", linewidth=2)
ax.set_title("Gráfico de Líneas con Anotaciones Dinámicas", fontsize=14)
ax.set_xlabel("Eje X", fontsize=12)
ax.set_ylabel("Eje Y", fontsize=12)
ax.grid(True, linestyle="--", alpha=0.5)
ax.legend(fontsize=10)

# Habilitar anotaciones dinámicas
cursor = mplcursors.cursor(line, hover=True)

@cursor.connect("add")
def on_add(sel):
    # Personalizar el texto de la anotación con coordenadas
    sel.annotation.set_text(f"x = {sel.target[0]:.2f}\ny = {sel.target[1]:.2f}")
    # Personalizar el fondo de la anotación
    sel.annotation.get_bbox_patch().set_facecolor("lightblue")
    sel.annotation.get_bbox_patch().set_alpha(0.8)

plt.show()
Gráfico de líneas mostrando anotaciones dinámicas personalizadas
Gráfico de líneas con anotaciones dinámicas personalizadas

Los pasos que se han seguido para conseguir esta gráfica son los siguientes:

  1. Configuración de los datos:
    • Se utiliza np.linspace para generar valores uniformemente espaciados en el eje X, y np.sin para calcular los valores de Y.
  2. Anotaciones dinámicas:
    • mplcursors.cursor() habilita las anotaciones dinámicas.
    • La función on_add personaliza el contenido de las anotaciones para mostrar las coordenadas del punto seleccionado (x e y con dos decimales).
  3. Estilización del gráfico:
    • Colores y grosores: El gráfico de líneas tiene un color distintivo (purple) y un ancho de línea ajustado (linewidth=2) para mayor claridad.
    • Cuadrícula y leyenda: La cuadrícula mejora la referencia visual, mientras que la leyenda identifica la serie de datos.
  4. Personalización de las anotaciones:
    • El fondo de las anotaciones se establece en azul claro con transparencia (alpha=0.8), lo que mejora la visibilidad sin obstruir el gráfico.

Al pasar el cursor sobre la línea, aparecerá una anotación que muestra las coordenadas exactas del punto resaltado. Esto permite explorar de manera interactiva los valores de la función representada.

Gráfico de barras con cálculos adicionales

Los gráficos de barras son ideales para representar datos categóricos, y al combinar mplcursors con cálculos personalizados, se puede enriquecer las anotaciones con información adicional, como porcentajes o valores acumulativos. Un ejemplo de esto sería el siguiente:

import matplotlib.pyplot as plt
import mplcursors

# Datos de ejemplo para un gráfico de barras
categories = ["A", "B", "C", "D", "E"]
values = [15, 25, 35, 20, 30]
total = sum(values)

# Crear el gráfico de barras
fig, ax = plt.subplots(figsize=(8, 6))
bars = ax.bar(categories, values, color="orange", alpha=0.8)
ax.set_title("Gráfico de Barras con Anotaciones Avanzadas", fontsize=14)
ax.set_ylabel("Valores", fontsize=12)
ax.grid(axis="y", linestyle="--", alpha=0.5)

# Habilitar anotaciones dinámicas con cálculos adicionales
cursor = mplcursors.cursor(bars, hover=True)

@cursor.connect("add")
def on_add(sel):
    # Calcular el porcentaje del total
    percentage = (values[sel.index] / total) * 100
    # Configurar el texto de la anotación
    sel.annotation.set_text(
        f"Categoría: {categories[sel.index]}\nValor: {values[sel.index]}\nPorcentaje: {percentage:.2f}%"
    )
    # Personalizar el estilo de la anotación
    sel.annotation.get_bbox_patch().set_facecolor("blue")
    sel.annotation.get_bbox_patch().set_alpha(0.7)

plt.show()
Gráfico de barras mostrando anotaciones dinámicas personalizadas
Gráfico de barras con anotaciones dinámicas personalizadas

Los principales puntos de este ejemplo son:

  1. Datos adicionales en las anotaciones:
    • Además del valor de cada barra, se calcula y muestra el porcentaje que representa sobre el total.
  2. Estilización:
    • El fondo de las anotaciones tiene un color azul con transparencia (alpha=0.7) para mejorar la visibilidad.
    • Las anotaciones incluyen el nombre de la categoría correspondiente, lo que las hace más descriptivas.
  3. Interactividad:
    • Las anotaciones aparecen al pasar el cursor sobre cada barra, evitando la sobrecarga visual típica de anotaciones estáticas.

Publicidad


Consejos para usar mplcursors de manera efectiva

Para maximizar la utilidad y claridad de los gráficos interactivos con mplcursors, es importante tener en cuenta los siguientes puntos:

  1. Mantener la simplicidad: Asegurarse de que las anotaciones sean claras y concisas. Incluir demasiada información puede dificultar su interpretación.
  2. Selección de los colores adecuados: Usar colores de fondo para las anotaciones que contrasten bien con el gráfico, sin resultar intrusivos.
  3. Ajustar la transparencia: Emplear transparencias (alpha) para hacer que las anotaciones sean visibles pero no obstruyan elementos importantes del gráfico.
  4. Evitar superposiciones: Si hay muchos elementos en el gráfico, se debe ajustar automáticamente la posición de las anotaciones para evitar que se solapen con otros elementos o texto.
  5. Probar diferentes estilos de gráficos: Experimentar con tipos de gráficos más adecuados para los diferentes datos, como líneas, dispersión o barras apiladas, asegurándose de que las anotaciones agreguen valor.

Al seguir estos consejos, se pueden crear gráficos interactivos que no solo sean visualmente atractivos, sino también funcionales y fáciles de interpretar.

Conclusiones

Las anotaciones dinámicas son una herramienta con la que se puede mejorar la interactividad y comprensión de los gráficos, especialmente cuando se trabaja con grandes volúmenes de datos o se requiere destacar puntos clave sin saturar la visualización. Aunque Matplotlib no incluye soporte nativo para este tipo de funcionalidades, la biblioteca mplcursors ofrece una solución sencilla y altamente personalizable.

Con mplcursors, es posible transformar gráficos estáticos en herramientas interactivas que facilitan la exploración y el análisis de datos. Ya sea en gráficos de dispersión, líneas, barras u otros tipos, las anotaciones dinámicas no solo mejoran la estética de las visualizaciones, sino que también proporcionan contexto en tiempo real, adaptándose a las necesidades específicas de cada proyecto.

En resumen, integrar mplcursors en las gráficas de Matplotlib abre nuevas posibilidades para crear visualizaciones que no sólo informen, sino que también involucran al usuario de manera activa, haciendo que los datos sean más accesibles y comprensibles.

¿Te ha parecido de utilidad el contenido?

¡Puntúalo entre una y cinco estrellas!

Puntuación promedio 0 / 5. Votos emitidos: 0

Ya que has encontrado útil este contenido...

¡Síguenos en redes sociales!

¡Siento que este contenido no te haya sido útil!

¡Déjame mejorar este contenido!

Dime, ¿cómo puedo mejorar este contenido?

Publicidad


Publicaciones relacionadas

  • Programador de tareas de Windows: Guía definitiva para automatizar tu trabajo (BAT, PowerShell y Python)
  • La Paradoja del Cumpleaños, o por qué no es tan raro compartir fecha de nacimiento
  • Cómo abrir una ventana de Chrome con tamaño y posición específicos desde la línea de comandos en Windows
  • Curiosidad: El sesgo de supervivencia, o por qué prestar atención sólo a los que “llegaron” puede engañarte
  • Documentar tu API de Express con TypeScript usando OpenAPI (Swagger)
  • Data Lake y Data Warehouse: diferencias, usos y cómo se complementan en la era del dato
  • ¿Media, mediana o moda en variables ordinales? Guía práctica para el análisis de datos
  • Cómo ejecutar JavaScript desde Python: Guía práctica con js2py
  • Cómo generar contraseñas seguras con Python (y entender su nivel de seguridad)

Publicado en: Python Etiquetado como: Matplotlib

Interacciones con los lectores

Deja una respuesta Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

I accept the Terms and Conditions and the Privacy Policy

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Barra lateral principal

Suscríbete a nuestro boletín

Suscríbete al boletín semanal para estar al día de todas las publicaciones.

Política de Privacidad

Analytics Lane en redes sociales

  • Amazon
  • Bluesky
  • Facebook
  • GitHub
  • Instagram
  • Mastodon
  • Pinterest
  • RSS
  • Telegram
  • Tumblr
  • Twitter
  • YouTube

Publicidad

Entradas recientes

Curiosidad: ¿Por qué los datos “raros” son tan valiosos?

noviembre 6, 2025 Por Daniel Rodríguez

Cómo generar contraseñas seguras con Python (y entender su nivel de seguridad)

noviembre 4, 2025 Por Daniel Rodríguez

Cómo ejecutar JavaScript desde Python: Guía práctica con js2py

octubre 30, 2025 Por Daniel Rodríguez

Publicidad

Es tendencia

  • Curiosidad: ¿Por qué los datos “raros” son tan valiosos? publicado el noviembre 6, 2025 | en Ciencia de datos, Opinión
  • Convertir un Notebook en un archivo de Python publicado el marzo 2, 2022 | en Herramientas, Python
  • Redondear la hora en Python para agrupar datos publicado el octubre 26, 2020 | en Python
  • Diferencias entre CPU, GPU, TPU y NPU publicado el abril 19, 2023 | en Herramientas
  • ¿Cómo comprobar si un archivo existe en Python sin generar excepciones? publicado el junio 2, 2025 | en Python

Publicidad

Lo mejor valorado

4.9 (24)

Seleccionar filas y columnas en Pandas con iloc y loc

4.6 (16)

Archivos JSON con Python: lectura y escritura

4.4 (14)

Ordenación de diccionarios en Python mediante clave o valor

4.7 (13)

Operaciones de filtrado de DataFrame con Pandas en base a los valores de las columnas

4.5 (10)

Diferencias entre var y let en JavaScript

Publicidad

Comentarios recientes

  • Daniel Rodríguez en Probabilidad básica: cómo entender el azar en nuestra vida diaria
  • Pepe en Probabilidad básica: cómo entender el azar en nuestra vida diaria
  • CARLOS ARETURO BELLO CACERES en Justicio: La herramienta gratuita de IA para consultas legales
  • Piera en Ecuaciones multilínea en Markdown
  • Daniel Rodríguez en Tutorial de Mypy para Principiantes

Publicidad


Footer

Analytics Lane

  • Acerca de Analytics Lane
  • Boletín de noticias
  • Contacto
  • Libros
  • Lo más popular
  • Noticias
  • Tienda
  • Tiendas afiliadas

Secciones

  • Ciencia de datos
  • Criptografía
  • Herramientas
  • Machine Learning
  • Opinión
  • Productividad
  • Programación
  • Reseñas

Sobre de Analytics Lane

En Analytics Lane tratamos de explicar los principales conceptos de la ciencia e ingeniería de datos con un enfoque práctico. Los principales temas tratados son ciencia de datos, ingeniería de datos, inteligencia artificial, machine learning, deep learning y criptografía. Además, también se habla de los principales lenguajes de programación y herramientas utilizadas por los científicos e ingenieros de datos.

Copyright © 2018-2025 Analytics Lane ·Términos y condiciones ·Política de Cookies ·Política de Privacidad ·Herramientas de privacidad ·Contacto