Como criar uma única legenda para todos os subquadros em Matplotlib

Jinku Hu 30 janeiro 2023 1 novembro 2020
  1. Faça uma única legenda para todos os subquadros com o método figure.legend em Matplotlib
  2. Faça uma única legenda para todos os subquadros com o método figure.legend quando as linhas e os cabos são diferentes na Matplotlib
Como criar uma única legenda para todos os subquadros em Matplotlib

A classe Matplotlib figure tem um método de legend para colocar a legend no nível da figura, mas não no nível do subplot. É especialmente conveniente se o padrão e as etiquetas das linhas forem os mesmos entre todos os subquadros.

Faça uma única legenda para todos os subquadros com o método figure.legend em 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()

Legenda da Figura Matplotlib obter legenda dos rótulos

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

Porque temos a presunção de que todos os subquadros têm as mesmas linhas e etiquetas, portanto, que as alças e etiquetas dos últimos Axes poderiam ser utilizadas para toda a figura.

Faça uma única legenda para todos os subquadros com o método figure.legend quando as linhas e os cabos são diferentes na Matplotlib

Se o padrão de linha e as etiquetas são diferentes entre os subquadros, mas uma única legenda é necessária para todos os subquadros, precisamos obter todos os cabos de linha e etiquetas de todos os subquadros.

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 Legenda_todos os rótulos do get_legend_handles_labels

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

Todas as linhas e rótulos são adicionados à lista de lines e labels com o método de extend no caso de existirem mais linhas e rótulos em um único subplot.

Author: 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

Artigo relacionado - Matplotlib Legend