Skip to content

Posicionamiento de la leyenda fuera del gráfico en Matplotlib

Updated on

Gestionar el posicionamiento de las leyendas en visualizaciones de datos a menudo puede resultar un desafío. Hoy, vamos a abordar este problema de frente, demostrando cómo colocar de manera efectiva una leyenda fuera de un gráfico utilizando la popular biblioteca de visualización de datos, Matplotlib. ¡Sumérgete y asegúrate de que tus leyendas nunca interfieran con tus datos nuevamente!

Entendiendo el problema

La leyenda de un gráfico, aunque es un elemento vital para la interpretación de los datos, a veces puede ocupar un espacio valioso en el gráfico, lo que lleva a gráficos más llenos y menos legibles. Una solución popular a este problema es mover la leyenda fuera del área del gráfico.

La solución de Matplotlib

Matplotlib, una biblioteca sólida y versátil de Python para visualización de datos, proporciona una solución sencilla para posicionar la leyenda fuera del gráfico.

Para ilustrar el concepto, primero crearemos un gráfico de línea simple utilizando la API pyplot de Matplotlib:

import matplotlib.pyplot as plt
import numpy as np
 
x = np.linspace(0, 10, 100)
 
plt.plot(x, np.sin(x), label='sin(x)')
plt.plot(x, np.cos(x), label='cos(x)')
plt.legend()
plt.show()

En el código anterior, tenemos dos gráficos de líneas que representan sin(x) y cos(x). La llamada a la función legend() agrega una leyenda al gráfico dentro del área del gráfico, a menudo ocultando partes de los datos.

Posicionamiento de la leyenda fuera del gráfico

Para mover la leyenda fuera del gráfico, podemos usar el parámetro bbox_to_anchor de la función legend(). Este parámetro nos permite especificar la posición del cuadro delimitador de la leyenda en relación con los ejes del gráfico.

Aquí hay un ejemplo donde colocamos la leyenda a la derecha del gráfico:

plt.plot(x, np.sin(x), label='sin(x)')
plt.plot(x, np.cos(x), label='cos(x)')
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left')
plt.show()

En este código, bbox_to_anchor=(1.05, 1) coloca el cuadro delimitador de la leyenda justo fuera de los ejes en la esquina superior izquierda. loc='upper left' especifica el punto en el cuadro de la leyenda que debe colocarse en las coordenadas dadas en bbox_to_anchor.

Ajustando la leyenda

Además del posicionamiento básico, podemos hacer varios ajustes a la leyenda para que se ajuste mejor a nuestras necesidades.

Reducción del tamaño de fuente

Para reducir el tamaño de fuente del texto de la leyenda:

plt.plot(x, np.sin(x), label='sin(x)')
plt.plot(x, np.cos(x), label='cos(x)')
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', prop={'size': 6})
plt.show()

En este código, prop={'size': 6} reduce el tamaño de fuente del texto de la leyenda, haciendo que el cuadro de la leyenda en general sea más pequeño.

Cambio de la orientación de la leyenda

Si deseas una leyenda horizontal, utiliza el parámetro ncol para especificar el número de columnas:

plt.plot(x, np.sin(x), label='sin(x)')
plt.plot(x, np.cos(x), label='cos(x)')
plt.legend(bbox_to_anchor=(0.5, -0.15), loc='upper center', ncol=2)
plt.show()

Tomando el control del posicionamiento de tu leyenda en Matplotlib

Una de las tareas recurrentes en la visualización de datos con Python es crear gráficos claros, concisos y atractivos. Una parte crucial para lograr esto implica colocar correctamente la leyenda fuera del gráfico en Matplotlib. Esta guía completa te guiará a través de diversos métodos para lograr exactamente eso.

Bbox_to_anchor: Tu boleto para un mejor posicionamiento de la leyenda

Existen numerosos enfoques para posicionar la leyenda fuera del cuadro del gráfico en Matplotlib. Uno de los métodos más flexibles y eficientes implica el uso del argumento de palabra clave bbox_to_anchor. Sumergámonos más en cómo puedes utilizar esta poderosa función para mejorar la estética de tus gráficos.

Para una aplicación básica de bbox_to_anchor, considera el siguiente ejemplo donde la leyenda se desplaza ligeramente fuera de los límites de los ejes:

import matplotlib.pyplot as plt
import numpy as np
 
x = np.arange(10)
 
fig = plt.figure()
ax = plt.subplot(111)
 
for i in range(5):
    ax.plot(x, i * x, label='$y = %ix$' % i)
 
ax.legend(bbox_to_anchor=(1.1, 1.05))
 
plt.show()

En el fragmento de código anterior, la leyenda se coloca estratégicamente ligeramente a la derecha y por encima de la esquina superior derecha de los límites de los ejes, asegurando así que no obstruya el gráfico y que siga siendo fácilmente visible.

Desbloqueando el poder de Shrink: otra clave para un posicionamiento óptimo de la leyenda

En escenarios donde deseas desplazar aún más la leyenda fuera del gráfico, puedes considerar reducir las dimensiones actuales del gráfico. Veamos un ejemplo de código:

import matplotlib.pyplot as plt
import numpy as np
 
x = np.arange(10)
 
fig = plt.figure()
ax = plt.subplot(111)
 
for i in range(5):
    ax.plot(x, i * x, label='$y = %ix$'%i)
 
# Reducir el tamaño del eje actual en un 20%
box = ax.get_position()
ax.set_position([box.x0, box.y0, box.width * 0.8, box.height])
 
# Colocar una leyenda a la derecha del eje actual
ax.legend(loc='center left', bbox_to_anchor=(1, 0.5))
 
plt.show()

Este enfoque nos permite dedicar una parte del espacio de trazado para acomodar cómodamente la leyenda. Observa cómo utilizamos ax.get_position() para obtener la posición actual de los ejes, luego la ajustamos antes de reposicionar la leyenda.

Colocando la leyenda en la parte inferior del gráfico

Si colocar la leyenda a la derecha del gráfico no es adecuado, también existe la opción de colocarla debajo del gráfico. A continuación se muestra un ejemplo:

import matplotlib.pyplot as plt
import numpy as np
 
x = np.arange(10)
 
fig = plt.figure()
ax = plt.subplot(111)
 
for i in range(5):
    line, = ax.plot(x, i * x, label='$y = %ix$'%i)
 
# Reducir la altura del eje actual en un 10% en la parte inferior
box = ax.get_position()
ax.set_position([box.x0, box.y0 + box.height * 0.1, 
                 box.width, box.height * 0.9])
 
# Colocar una leyenda debajo del eje actual
ax.legend(loc='upper center', bbox_to_anchor=(0.5, -0.05), 
          fancybox=True, shadow=True, ncol=5)
 
plt.show()

Este enfoque ayuda a utilizar el espacio disponible de manera efectiva sin obstruir la vista del gráfico.

La Leyenda de las Leyendas: Guía de Leyenda en Matplotlib

Como aspirante a científico de datos o profesional experimentado, saber cómo controlar la ubicación de la leyenda en tus gráficos de Matplotlib es una habilidad esencial. Ahora que hemos cubierto varios métodos para colocar la leyenda fuera del gráfico, profundicemos en algunas personalizaciones avanzadas.

Mejorando el Estilo de la Leyenda

A veces, queremos hacer nuestra leyenda aún más legible y estéticamente atractiva. Los parámetros fancybox, shadow y borderpad permiten una variedad de opciones de estilo:

ax.legend(loc='upper center', bbox_to_anchor=(0.5, -0.05), 
          fancybox=True, shadow=True, borderpad=1.5, ncol=5)

En este ejemplo, fancybox=True proporciona a la caja de la leyenda esquinas redondeadas, shadow=True agrega un efecto de sombra y borderpad=1.5 aumenta el relleno dentro de la caja.

Ordenando las Entradas de la Leyenda

En algunos casos, es posible que desees cambiar el orden de las entradas en la leyenda. La clase HandlerLine2D en Matplotlib puede ayudarte a lograr esto. Aquí tienes una ilustración sencilla:

from matplotlib.lines import Line2D
 
fig, ax = plt.subplots()
lines = []
labels = []
 
for i in range(5):
    line, = ax.plot(x, i * x, label='$y = %ix$' % i)
    lines.append(line)
    labels.append('$y = %ix$' % i)
 
# Reordena las etiquetas y los manejadores de las líneas
lines = [lines[i] for i in [4, 2, 0, 1, 3]]
labels = [labels[i] for i in [4, 2, 0, 1, 3]]
 
# Crea una leyenda para la primera línea
first_legend = plt.legend(lines[0:2], labels[0:2], loc='upper left')
 
# Agrega manualmente la leyenda al eje actual
ax.add_artist(first_legend)
 
# Crea otra leyenda para el resto.
plt.legend(lines[2:], labels[2:], loc='lower right')
 
plt.show()

En este escenario, primero trazamos las líneas, almacenamos sus manejadores y etiquetas, y luego las reordenamos según nuestras preferencias.

Alternativa a Matplotlib: Visualizar Datos con PyGWalker

Además de utilizar Matplotlib para visualizar tu dataframe de pandas, aquí tienes una alternativa, una biblioteca de Python de código abierto que puede ayudarte a crear visualizaciones de datos con facilidad: PyGWalker (opens in a new tab).

PyGWalker para visualización de datos (opens in a new tab)

¡Ya no es necesario realizar procesamientos complicados con programación en Python, simplemente importa tus datos y arrastra y suelta variables para crear todo tipo de visualizaciones de datos! Aquí tienes un video demostrativo rápido sobre su funcionamiento:


Así es como se usa PyGWalker en tu Jupyter Notebook:

pip install pygwalker
import pygwalker as pyg
gwalker = pyg.walk(df)

Alternativamente, puedes probarlo en Kaggle Notebook/Google Colab:

Ejecutar PyGWalker en Kaggle Notebook (opens in a new tab)Ejecutar PyGWalker en Google Colab (opens in a new tab)Dale ⭐️ a PyGWalker en GitHub (opens in a new tab)
Ejecutar PyGWalker en Kaggle Notebook (opens in a new tab)Ejecutar PyGWalker en Google Colab (opens in a new tab)Ejecutar PyGWalker en Google Colab (opens in a new tab)

PyGWalker se basa en el apoyo de nuestra comunidad de código abierto. ¡No olvides visitar PyGWalker en GitHub (opens in a new tab) y darle una estrella!

Conclusión

Comprender las diversas opciones de personalización de la leyenda de Matplotlib es clave para crear gráficos de calidad profesional. Así que asegúrate de practicar estas técnicas y explorar la documentación de Matplotlib para volverte experto en esta herramienta esencial para la visualización de datos.

Preguntas Frecuentes

A continuación, responderemos algunas preguntas frecuentes sobre la ubicación de la leyenda en Matplotlib.

P1: ¿Puedo colocar una leyenda de Matplotlib fuera del área del gráfico sin cambiar el tamaño del gráfico en sí?

Sí, puedes colocar la leyenda fuera del gráfico sin cambiar el tamaño del gráfico. Sin embargo, la leyenda puede no ser visible en la figura guardada porque la opción bbox_inches='tight' en plt.savefig() puede no considerar los elementos fuera de los límites de los ejes.

P2: ¿Hay alguna manera de determinar automáticamente la mejor ubicación para la leyenda?

Sí, Matplotlib proporciona una forma de determinar automáticamente la mejor ubicación para la leyenda pasando loc='best' en la función legend(). Esta característica coloca la leyenda en la ubicación que minimiza su superposición con el gráfico.

P3: ¿Cómo puedo hacer que las etiquetas de la leyenda sean más legibles si se superponen con el gráfico?

Puedes aumentar la legibilidad de las etiquetas de la leyenda utilizando un fondo de leyenda semitransparente. Esto se puede lograr estableciendo el parámetro framealpha en legend(). Por ejemplo, ax.legend(framealpha=0.5) establece el fondo de la leyenda como semitransparente.