Cómo crear una única leyenda para todas las subtramas de Matplotlib

  1. Hacer una sola leyenda para todas las subplots con el método figure.legend en Matplotlib
  2. Hacer una sola leyenda para todas las subplots con el método figure.legend cuando los mangos y líneas de las líneas son diferentes en Matplotlib

La clase figure de Matplotlib tiene un método de legend para colocar la legend en el nivel de la figura pero no en el nivel de la subplot. Es especialmente conveniente si el patrón de las líneas y las etiquetas son las mismas entre todas las subtramas.

Hacer una sola leyenda para todas las subplots con el método figure.legend en Matplotlib

import matplotlib.pyplot as plt

fig = plt.figure()
axes = fig.subplots(nrows=2, ncols=2)


for ax in fig.axes:
    ax.plot([0, 10], [0, 10], label='linear')

lines, labels = fig.axes[-1].get_legend_handles_labels()
    
fig.legend(lines, labels, loc = 'upper center')

plt.show()

La leyenda de la figura de Matplotlib recibe etiquetas de mangos de leyenda

lines, labels = fig.axes[-1].get_legend_handles_labels()

Porque tenemos la presunción de que todas las subtramas tienen las mismas líneas y etiquetas, por lo tanto, que las manijas y etiquetas de los últimos Axes podrían ser usadas para toda la figura.

Hacer una sola leyenda para todas las subplots con el método figure.legend cuando los mangos y líneas de las líneas son diferentes en Matplotlib

Si el patrón de líneas y las etiquetas son diferentes entre las subtramas pero se requiere una sola leyenda para todas las subtramas, necesitamos obtener todos los mangos de líneas y etiquetas de todas las subtramas.

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 501)

fig = plt.figure()
axes = fig.subplots(nrows=2, ncols=2)

axes[0, 0].plot(x,
                np.sin(x),
                color = 'k',
                label="sin(x)")
axes[0, 1].plot(x,
                np.cos(x),                
                color = 'b',
                label="cos(x)")
axes[1, 0].plot(x,
                np.sin(x) + np.cos(x),
                color = 'r',
                label="sin(x)+cos(x)")
axes[1, 1].plot(x,
                np.sin(x) - np.cos(x),
                color = 'm',
                label="sin(x)-cos(x)")

lines = []
labels = []

for ax in fig.axes:
    axLine, axLabel = ax.get_legend_handles_labels()
    lines.extend(axLine)
    labels.extend(axLabel)

    
fig.legend(lines, labels,           
           loc = 'upper right')

plt.show()

Figura Matplotlib Leyenda_todas las etiquetas de get_legend_handles_labels

for ax in fig.axes:
    axLine, axLabel = ax.get_legend_handles_labels()
    lines.extend(axLine)
    labels.extend(axLabel)

Todas las líneas y etiquetas se añaden a la lista de lines y labels con el método de la lista extend en caso de que existan más líneas y etiquetas en una sola subtrama.

Artículo relacionado - Matplotlib Legend

  • Cómo establecer el ancho de línea de las líneas en la leyenda Matplotlib
  • Título de la leyenda de Matplotlib