HOWTO · Matplotlib
Cómo crear una única leyenda para todas las subtramas de Matplotlib
La clase de figuras Matplotlib tiene un método de leyenda para colocar la leyenda en el nivel de figura pero no en el nivel de subtrama. Es especialmente conveniente si el patrón de las líneas y las etiquetas son las mismas entre todas las subplots.
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()
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()
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.