Criação de Subplots no Matplotlib

MatplotlibBeginner
Pratique Agora

Introdução

Na visualização de dados, é frequentemente útil exibir múltiplos gráficos em uma única figura. Isso permite uma comparação fácil entre diferentes conjuntos de dados ou diferentes visualizações dos mesmos dados. O Matplotlib oferece uma maneira poderosa e conveniente de criar tais figuras usando subplots.

A forma mais comum de criar subplots é com a função plt.subplots(). Esta função cria uma figura e uma grade de subplots em uma única chamada, retornando um objeto Figure e um array de objetos Axes, que representam cada subplot individual.

Neste laboratório, você aprenderá a:

  • Criar uma figura contendo múltiplos subplots.
  • Plotar dados em subplots específicos.
  • Ajustar o layout para evitar que os gráficos se sobreponham.
  • Compartilhar eixos entre subplots para comparações mais claras.

Você escreverá e executará scripts Python no WebIDE. Como este ambiente não suporta janelas gráficas interativas, você salvará seus gráficos como arquivos de imagem e os visualizará diretamente no editor.

Este é um Lab Guiado, que fornece instruções passo a passo para ajudá-lo a aprender e praticar. Siga as instruções cuidadosamente para completar cada etapa e ganhar experiência prática. Dados históricos mostram que este é um laboratório de nível iniciante com uma taxa de conclusão de 100%. Recebeu uma taxa de avaliações positivas de 100% dos estudantes.

Criar figura e eixos usando plt.subplots()

Nesta etapa, você começará criando uma figura que contém dois subplots vazios dispostos em uma linha e duas colunas. Este é o passo fundamental para construir visualizações com múltiplos gráficos.

Usaremos a função plt.subplots(). Quando você chama plt.subplots(nrows, ncols), ela retorna dois itens:

  1. Um objeto Figure, que é a janela ou página geral em que tudo é desenhado. Geralmente o atribuímos a uma variável chamada fig.
  2. Um array de objetos Axes. Cada objeto Axes representa um dos subplots na grade. Você pode acessá-los pelo seu índice. Para uma grade (1, 2), podemos desempacotar este array em duas variáveis, ax1 e ax2.

Vamos escrever o código. Abra o arquivo main.py no explorador de arquivos à esquerda e adicione o seguinte conteúdo. Este script importará as bibliotecas necessárias, criará uma figura com dois subplots e a salvará como um arquivo de imagem chamado plot1.png.

import matplotlib.pyplot as plt
import numpy as np

## Create a figure and a set of subplots.
## 1 row, 2 columns.
fig, (ax1, ax2) = plt.subplots(1, 2)

## Save the figure to a file.
## The file will be created in the /home/labex/project directory.
plt.savefig('plot1.png')

print("Figure saved as plot1.png")

Agora, execute o script a partir do terminal para gerar o gráfico.

python3 main.py

Você deverá ver a seguinte saída no seu terminal:

Figure saved as plot1.png

Um novo arquivo chamado plot1.png aparecerá no explorador de arquivos. Dê um duplo clique nele para visualizar sua primeira figura com dois subplots vazios.

Plot1

Plotar no primeiro subplot usando ax1.plot()

Nesta etapa, você aprenderá a desenhar um gráfico em um dos objetos Axes específicos que você criou. Cada objeto Axes possui seus próprios métodos de plotagem, como plot(), bar(), scatter(), etc., que são semelhantes às funções na interface principal plt.

Plotaremos uma onda senoidal simples no primeiro subplot, que é representado pela variável ax1. Também adicionaremos um título a este subplot usando o método set_title().

Atualize seu arquivo main.py com o seguinte código. Estamos adicionando a geração de dados usando NumPy e, em seguida, plotando-os em ax1.

import matplotlib.pyplot as plt
import numpy as np

## Create some data
x = np.linspace(0, 2 * np.pi, 400)
y = np.sin(x ** 2)

## Create a figure and a set of subplots
fig, (ax1, ax2) = plt.subplots(1, 2)

## Plot on the first subplot (ax1)
ax1.plot(x, y)
ax1.set_title('Sine Wave')

## Save the figure to a new file
plt.savefig('plot2.png')

print("Figure saved as plot2.png")

Agora, execute o script atualizado no terminal.

python3 main.py

Você verá esta saída:

Figure saved as plot2.png

Um novo arquivo, plot2.png, agora está no seu diretório de projeto. Abra-o para ver o resultado. O subplot da esquerda agora deve conter um gráfico de onda senoidal, enquanto o da direita permanece vazio.

Plot2

Plotar no segundo subplot usando ax2.plot()

Nesta etapa, você completará a figura adicionando um gráfico ao segundo subplot. O processo é idêntico à etapa anterior, mas desta vez você chamará o método plot() no objeto ax2.

Vamos plotar uma onda cosseno no segundo subplot para compará-la com a onda seno. Também daremos um título a ela.

Modifique seu arquivo main.py para incluir a plotagem no segundo eixo.

import matplotlib.pyplot as plt
import numpy as np

## Create some data
x = np.linspace(0, 2 * np.pi, 400)
y1 = np.sin(x ** 2)
y2 = np.cos(x ** 2)

## Create a figure and a set of subplots
fig, (ax1, ax2) = plt.subplots(1, 2)

## Plot on the first subplot (ax1)
ax1.plot(x, y1)
ax1.set_title('Sine Wave')

## Plot on the second subplot (ax2)
ax2.plot(x, y2, 'tab:orange')
ax2.set_title('Cosine Wave')

## Save the figure to a new file
plt.savefig('plot3.png')

print("Figure saved as plot3.png")

No código acima, adicionamos 'tab:orange' à chamada ax2.plot() para alterar a cor da linha, tornando os gráficos visualmente distintos.

Execute o script novamente no terminal.

python3 main.py

A saída será:

Figure saved as plot3.png

Agora, abra plot3.png. Você verá uma figura completa com dois gráficos lado a lado. No entanto, você pode notar que os títulos ou rótulos dos eixos podem estar um pouco apertados. Resolveremos isso na próxima etapa.

Plot3

Ajustar layout do subplot usando plt.tight_layout()

Nesta etapa, você aprenderá a ajustar automaticamente o espaçamento entre os subplots para evitar que títulos e rótulos se sobreponham. O Matplotlib fornece uma função simples para isso: plt.tight_layout().

Esta função examina as caixas delimitadoras de todos os artistas na figura (como títulos, rótulos e os próprios gráficos) e ajusta os parâmetros do subplot para que tudo se encaixe perfeitamente sem sobreposição. É uma boa prática chamá-la logo antes de salvar ou exibir seu gráfico.

Vamos adicionar plt.tight_layout() ao nosso script. Atualize main.py da seguinte forma:

import matplotlib.pyplot as plt
import numpy as np

## Create some data
x = np.linspace(0, 2 * np.pi, 400)
y1 = np.sin(x ** 2)
y2 = np.cos(x ** 2)

## Create a figure and a set of subplots
fig, (ax1, ax2) = plt.subplots(1, 2)

## Plot on the first subplot (ax1)
ax1.plot(x, y1)
ax1.set_title('Sine Wave')

## Plot on the second subplot (ax2)
ax2.plot(x, y2, 'tab:orange')
ax2.set_title('Cosine Wave')

## Adjust layout to prevent overlap
plt.tight_layout()

## Save the figure to a new file
plt.savefig('plot4.png')

print("Figure saved as plot4.png")

A única alteração é a adição da linha plt.tight_layout(). Agora, execute o script.

python3 main.py

Saída:

Figure saved as plot4.png

Abra plot4.png e compare-o com plot3.png. Você deverá notar que o espaçamento entre os dois subplots foi otimizado, proporcionando uma figura mais limpa e com aparência profissional.

Plot4

Compartilhar eixos usando sharex=True ou sharey=True

Nesta etapa, você aprenderá a criar subplots que compartilham um eixo comum. Isso é particularmente útil quando você está comparando conjuntos de dados que têm a mesma escala x ou y. Quando os eixos são compartilhados, o zoom ou o pan em um subplot atualizará automaticamente o outro. Isso também ajuda a organizar a figura, removendo rótulos de ticks redundantes.

Você pode habilitar o compartilhamento de eixos passando os argumentos sharex=True ou sharey=True para plt.subplots().

Para demonstrar isso, vamos criar um novo script. Crie um arquivo chamado shared_axes.py em seu diretório de projeto e adicione o seguinte código. Este exemplo criará dois subplots empilhados verticalmente (nrows=2, ncols=1) que compartilham o mesmo eixo x.

import matplotlib.pyplot as plt
import numpy as np

## Create data
t = np.arange(0.01, 5.0, 0.01)
s1 = np.exp(t)
s2 = np.sin(2 * np.pi * t)

## Create a figure and two subplots that share the x-axis
fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True)

## Plot on the first subplot
ax1.plot(t, s1, 'tab:blue')
ax1.set_ylabel('Exponential')

## Plot on the second subplot
ax2.plot(t, s2, 'tab:orange')
ax2.set_ylabel('Sinusoidal')
ax2.set_xlabel('time (s)')

## Adjust layout
plt.tight_layout()

## Save the figure
plt.savefig('plot5.png')

print("Figure saved as plot5.png")

Agora, execute este novo script a partir do terminal.

python3 shared_axes.py

Saída:

Figure saved as plot5.png

Abra plot5.png. Observe que os rótulos dos ticks do eixo x estão presentes apenas no subplot inferior (ax2). Isso ocorre porque sharex=True oculta automaticamente os rótulos dos eixos internos para criar uma aparência mais limpa. Ambos os gráficos estão perfeitamente alinhados ao longo do eixo x, tornando-os fáceis de comparar.

Plot5

Resumo

Parabéns por completar o laboratório! Você aprendeu as técnicas essenciais para criar e gerenciar subplots no Matplotlib.

Neste laboratório, você praticou:

  • Usar plt.subplots() para criar uma figura com uma grade de subplots.
  • Acessar objetos Axes individuais e usar seus métodos para plotar dados.
  • Adicionar títulos a subplots específicos.
  • Usar plt.tight_layout() para ajustar automaticamente o espaçamento e evitar a sobreposição de elementos.
  • Criar subplots com eixos compartilhados usando sharex=True para uma comparação de dados mais clara e uma figura mais organizada.

Essas habilidades são fundamentais para criar visualizações de dados complexas e informativas. Agora você pode construir figuras que comparam efetivamente vários conjuntos de dados em uma única visualização coerente.