HOWTO · Matplotlib

Como adicionar título a subquadrantes em Matplotlib

Podemos adicionar um título aos subplots em Matplotlib usando Axes.set_title(), Axes.title.set_text() ou os eixos atuais do pyplot (plt.gca()).

Nesta página

Para dar a cada subplot seu próprio título, chame Axes.set_title() no eixo correspondente. Essa é a opção mais clara quando você cria vários gráficos juntos, pois cada título permanece associado ao eixo que descreve. O título de um subplot pertence a um único eixo; use um título para a figura inteira, como fig.suptitle(), quando um cabeçalho deve descrever toda a figura.

Adicionar títulos aos subplots com Axes.set_title()

Quando squeeze=False é definido, plt.subplots() retorna uma figura e uma matriz de eixos. O exemplo a seguir plota quatro séries, associa cada eixo a um título descritivo e ajusta o layout antes de exibir a figura. Assim, axes permanece bidimensional para uma grade 2×2, uma única linha (1×N), uma única coluna (N×1) ou um único subplot (1×1). Para usar outra dimensão de grade, ajuste os argumentos de plt.subplots() e forneça um título para cada eixo.

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 2 * np.pi, 100)
series = [np.sin(x), np.cos(x), np.sin(2 * x), np.cos(2 * x)]
titles = ["Sine", "Cosine", "Sine, double frequency", "Cosine, double frequency"]

fig, axes = plt.subplots(2, 2, figsize=(8, 5), squeeze=False)
for ax, y, title in zip(axes.flat, series, titles):
    ax.plot(x, y)
    ax.set_title(title)

fig.tight_layout()
plt.show()

Uma grade 2×2 de subplots com títulos definidos por Axes.set_title(): Sine, Cosine, Sine double frequency e Cosine double frequency, cada título centralizado sobre sua curva.

Como squeeze=False mantém os eixos em uma matriz bidimensional até mesmo em uma grade 1×1, axes.flat percorre de forma consistente os quatro formatos de grade: 2×2, 1×N, N×1 e 1×1. zip() associa cada eixo e série de dados a um título; portanto, mantenha essas coleções na mesma ordem e com o mesmo tamanho.

O argumento label define o texto exibido acima de um eixo. Você também pode passar opções como fontsize ou loc para controlar a aparência e a posição do título. Mantenha títulos longos concisos; se houver pouco espaço entre títulos ou rótulos adjacentes, aumente o tamanho da figura ou ajuste o espaçamento antes de exibi-la. tight_layout() é um bom ponto de partida, embora um layout com muitos elementos decorativos possa exigir ajustes adicionais de espaçamento.

Definir títulos dos subplots com Axes.title.set_text()

Um eixo também expõe seu título como um objeto de texto. Use Axes.title.set_text() para definir ou atualizar esse texto depois que o eixo existir. Isso pode ser útil quando o programa já mantém uma referência ao objeto do título ou altera o texto mais tarde. Para configurar o gráfico inicialmente, Axes.set_title() costuma ser mais direto e deixa a operação clara no ponto em que o método do eixo é chamado.

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 2 * np.pi, 100)

fig, axes = plt.subplots(1, 2, figsize=(8, 3.5), squeeze=False)
axes[0, 0].plot(x, np.sin(x))
axes[0, 1].plot(x, np.cos(x))

axes[0, 0].title.set_text("Sine")
axes[0, 1].title.set_text("Cosine")

fig.tight_layout()
plt.show()

Dois subplots lado a lado cujos títulos foram definidos com Axes.title.set_text(): Sine sobre a curva seno e Cosine sobre a curva cosseno.

Por exemplo, depois de criar um eixo chamado ax, chame ax.title.set_text("Updated title"). Isso atualiza o título desse eixo; não define um título para todos os subplots da figura. Se houver vários eixos, selecione explicitamente aquele que deseja atualizar ou percorra os eixos e as strings correspondentes, como no primeiro exemplo. As duas APIs atuam sobre o título do eixo, então escolha um estilo para cada operação em vez de definir o mesmo título duas vezes.

Definir títulos dos subplots usando os eixos atuais do pyplot

Ao usar a interface do pyplot baseada em estado, plt.gca() retorna os eixos atuais. Você pode definir o título com plt.gca().set_title("Title"); a forma equivalente com o objeto de texto é plt.gca().title.set_text("Title"). Os parênteses são importantes: gca() é uma chamada de função que obtém os eixos atuais. Essas formas afetam somente os eixos que estiverem atuais naquele momento, por isso são úteis ao plotar um eixo de cada vez.

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 2 * np.pi, 100)
series = [np.sin(x), np.cos(x), np.sin(2 * x), np.cos(2 * x)]
titles = ["Sine", "Cosine", "Sine, double frequency", "Cosine, double frequency"]

plt.figure(figsize=(8, 5))
for position, (y, title) in enumerate(zip(series, titles), start=1):
    plt.subplot(2, 2, position)
    plt.plot(x, y)
    plt.gca().set_title(title)

plt.tight_layout()
plt.show()

A mesma grade 2×2 de curvas seno e cosseno, construída em um loop com plt.subplot() e plt.gca().set_title(), com um título sobre cada subplot.

Para uma grade, selecione cada subplot antes de definir seu título. Por exemplo, plt.subplot(2, 2, position) seleciona uma posição de um a quatro; em seguida, plt.gca().set_title(title) aplica o título ao eixo selecionado. Se você criar a grade com fig, axes = plt.subplots(...), usar as referências aos eixos retornadas costuma ser mais fácil de acompanhar e depender menos do estado atual do pyplot.

Conclua a configuração da figura antes de chamar plt.show(). Em particular, chame plt.tight_layout() antes de exibir a figura para que o layout possa levar em conta os títulos dos subplots.

Corrigir títulos sobrepostos ou cortados e títulos ausentes

Um título é centralizado sobre seu eixo, portanto um título longo pode ser mais largo que o próprio eixo. Com os dois títulos usados no exemplo a seguir, em uma figura de tamanho (8, 3.5), as caixas de título medidas se sobrepõem em 15 pixels quando nenhum ajuste de layout é aplicado, de modo que o fim de um título invade o início do próximo. Chamar fig.tight_layout() os separa — a mesma medição deixa então um espaço de 39 pixels —, mas tight_layout() apenas redistribui o espaço entre os subplots; ele não reduz o texto do título. Nesse tamanho de figura, o segundo título se estende 11 pixels além da borda direita da figura e é cortado na saída renderizada. A correção completa é dar espaço aos títulos: mantenha tight_layout() e aumente a largura da figura, como neste exemplo, ou encurte os títulos. Reduzir o fontsize do título para 11 no tamanho original também coloca os dois títulos totalmente dentro da figura.

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 2 * np.pi, 100)

fig, axes = plt.subplots(1, 2, figsize=(9, 3.5), squeeze=False)
axes[0, 0].plot(x, np.sin(x))
axes[0, 1].plot(x, np.cos(x))
axes[0, 0].set_title("Sine wave measured at the first sensor")
axes[0, 1].set_title("Cosine wave measured at the second sensor")

fig.tight_layout()
plt.show()

Dois subplots com os títulos longos Sine wave measured at the first sensor e Cosine wave measured at the second sensor, totalmente visíveis e separados após aumentar a largura da figura e aplicar tight_layout().

Com o tamanho (9, 3.5), os dois títulos terminam dentro da figura, com espaço entre eles, e nenhum texto é cortado. Já um título ausente falha silenciosamente: os loops deste artigo associam eixos e títulos por meio de zip(), e zip() para na sequência mais curta sem gerar erro. Fornecer três títulos para os quatro subplots de uma grade 2×2 deixa o quarto eixo com um título vazio — ao lê-lo de volta com ax.get_title(), retorna uma string vazia — e nada avisa você. Quando um subplot aparecer sem título, conte os títulos em relação aos eixos antes de verificar as próprias chamadas de título.