Cómo crear una única leyenda para todas las subtramas de Matplotlib
-
Hacer una sola leyenda para todas las subplots con el método
figure.legend
en Matplotlib -
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()
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.
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook