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

Jinku Hu 30 enero 2023
  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
Cómo crear una única leyenda para todas las subtramas de 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.

Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Artículo relacionado - Matplotlib Legend