HOWTO · Matplotlib

Cómo especificar la posición de la leyenda en las coordenadas de los gráficos en Matplotlib

Este artículo muestra cómo especificar la posición de la leyenda en un gráfico en Matplotlib.

En esta página

Para colocar una leyenda de Matplotlib, asigna a su parámetro loc una posición estándar, como "upper left" o "lower right". Para situarla en una coordenada concreta, combina loc con bbox_to_anchor: bbox_to_anchor proporciona la coordenada de anclaje y loc selecciona el punto de la leyenda que se alinea con ella. El valor predeterminado de borderaxespad añade una pequeña separación, por lo que el punto visible de la leyenda puede quedar ligeramente apartado de la coordenada; establece borderaxespad=0 si necesitas una alineación exacta.

Ejemplos: colocar una leyenda de Matplotlib con loc y bbox_to_anchor

El siguiente ejemplo crea dos ejes y añade una leyenda a cada uno. En el primer eje usa best y, en el segundo, lower left. Puedes cambiar estos valores para comparar posiciones estándar con tus propios datos. Las figuras muestran los gráficos resultantes; el código indica qué ajustes puedes modificar.

import matplotlib.pyplot as plt

x = [1, 2, 3]
y1 = [0.5 * i + 1 for i in x]
y2 = [2 * i + 1 for i in x]

fig, ax = plt.subplots(2, 1)

ax[0].plot(x, y1, "b-", label="0.5x+1")
ax[0].plot(x, y2, "g-", label="2x+1")
ax[0].legend(loc="best")

ax[1].plot(x, y1, "b-", label="0.5x+1")
ax[1].plot(x, y2, "g-", label="2x+1")
ax[1].legend(loc="lower left")

plt.tight_layout()
plt.show()

Specify Legend position in graph coordinates Matplotlib

El parámetro loc acepta valores como best, upper right, upper left, lower left, lower right, right, center left, center right, lower center, upper center y center:

best
upper right
upper left
lower left
lower right
right
center left
center right
lower center
upper center
center

Para una posición estándar, loc coloca la leyenda dentro de sus ejes. Con el valor best, Matplotlib elige una posición según el contenido del gráfico; los valores con nombre, como lower left, permiten elegirla directamente. Si la leyenda tapa una línea o un marcador importante, prueba otro valor de la lista. Estas opciones describen la posición de la leyenda con respecto a sus ejes, no una posición compartida por toda la figura.

Para colocar la leyenda según una coordenada, bbox_to_anchor proporciona la coordenada de anclaje y loc selecciona el punto de la leyenda que se alinea con ella. En el siguiente ejemplo, cada anclaje se expresa en coordenadas relativas a su propio eje. El marcador rojo se dibuja en esa misma coordenada mediante ax.transAxes, lo que permite localizar fácilmente el anclaje. Los dos ejes usan distintos valores de loc para mostrar cómo cambia el punto seleccionado de la leyenda. Con el valor predeterminado de borderaxespad, la leyenda queda ligeramente separada de cada marcador; el marcador sigue señalando la coordenada de anclaje.

import matplotlib.pyplot as plt

x = [1, 2, 3]
y1 = [0.5 * i + 1 for i in x]
y2 = [2 * i + 1 for i in x]

fig, ax = plt.subplots(2, 1)

ax[0].plot(x, y1, "b-", label="Plot-1")
ax[0].plot(x, y2, "g-", label="Plot-2")
ax[0].legend(loc="upper left", bbox_to_anchor=(0.9, 0.75))
ax[0].scatter((0.9), (0.75), s=70, c="red", transform=ax[0].transAxes)

ax[1].plot(x, y1, "b-", label="Plot-1")
ax[1].plot(x, y2, "g-", label="Plot-2")
ax[1].legend(loc="center right", bbox_to_anchor=(0.6, 0.4))
ax[1].scatter((0.6), (0.4), s=70, c="red", transform=ax[1].transAxes)

plt.tight_layout()
plt.show()

Set bbox_to_anchor to specify Legend position in graph coordinates Matplotlib

En el eje superior, bbox_to_anchor=(0.9, 0.75) sitúa el anclaje en el marcador rojo. Como loc="upper left", el punto superior izquierdo de la leyenda se alinea con ese anclaje, aunque queda una pequeña separación visible por el valor predeterminado de borderaxespad. En el eje inferior, el anclaje es (0.6, 0.4) y loc="center right", por lo que el punto central derecho de la leyenda se alinea con el marcador rojo inferior, con la misma separación. Para hacer coincidir exactamente cualquiera de esos puntos con su marcador, añade borderaxespad=0 a la llamada a legend de ese eje.

Para adaptar cualquiera de las dos posiciones, primero elige una coordenada x y otra y relativas al eje correspondiente; después, asigna la tupla correspondiente a bbox_to_anchor y marca ese punto mientras ajustas el gráfico. Selecciona un valor de loc para indicar qué punto de la leyenda quieres alinear allí. Ambos ajustes actúan conjuntamente: cambiar solo el anclaje mueve el punto seleccionado, mientras que cambiar loc modifica qué punto de la leyenda se alinea con el anclaje. Vincula la transformación de cada marcador al mismo eje que su leyenda para que la referencia visual use el mismo espacio de coordenadas. Mantén el valor predeterminado de borderaxespad para conservar una pequeña separación o establece borderaxespad=0 en la llamada a legend para alinear exactamente la leyenda con el marcador. No se muestra ninguna salida de consola; las figuras anteriores muestran los gráficos resultantes.