Criando várias subtramas usando plt.subplots#

pyplot.subplotscria uma figura e uma grade de subtramas com uma única chamada, enquanto fornece controle razoável sobre como as parcelas individuais são criadas. Para casos de uso mais avançados, você pode usar GridSpecpara um layout de subtrama mais geral ou Figure.add_subplotpara adicionar subtramas em locais arbitrários dentro da figura.

import matplotlib.pyplot as plt
import numpy as np

# Some example data to display
x = np.linspace(0, 2 * np.pi, 400)
y = np.sin(x ** 2)

Uma figura com apenas uma subtrama #

subplots()sem argumentos retorna um Figuree um único Axes.

Esta é realmente a maneira mais simples e recomendada de criar uma única Figura e Eixos.

fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_title('A single plot')
Um único enredo
Text(0.5, 1.0, 'A single plot')

Empilhando subparcelas em uma direção #

Os dois primeiros argumentos opcionais de pyplot.subplotsdefinem o número de linhas e colunas da grade da subtrama.

Ao empilhar em apenas uma direção, o retornado axsé um array numpy 1D contendo a lista de eixos criados.

fig, axs = plt.subplots(2)
fig.suptitle('Vertically stacked subplots')
axs[0].plot(x, y)
axs[1].plot(x, -y)
Subtramas empilhadas verticalmente
[<matplotlib.lines.Line2D object at 0x7f2d00efd510>]

Se você estiver criando apenas alguns eixos, é útil descompactá-los imediatamente em variáveis ​​dedicadas para cada eixo. Dessa forma, podemos usar ax1em vez do mais detalhado axs[0].

fig, (ax1, ax2) = plt.subplots(2)
fig.suptitle('Vertically stacked subplots')
ax1.plot(x, y)
ax2.plot(x, -y)
Subtramas empilhadas verticalmente
[<matplotlib.lines.Line2D object at 0x7f2d00a95b70>]

Para obter subtramas lado a lado, passe parâmetros para uma linha e duas colunas.1, 2

fig, (ax1, ax2) = plt.subplots(1, 2)
fig.suptitle('Horizontally stacked subplots')
ax1.plot(x, y)
ax2.plot(x, -y)
Subtramas empilhadas horizontalmente
[<matplotlib.lines.Line2D object at 0x7f2cfb43d330>]

Empilhando subtramas em duas direções #

Ao empilhar em duas direções, o retornado axsé um array NumPy 2D.

Se você tiver que definir parâmetros para cada subplot, é útil iterar todos os subplots em uma grade 2D usando .for ax in axs.flat:

fig, axs = plt.subplots(2, 2)
axs[0, 0].plot(x, y)
axs[0, 0].set_title('Axis [0, 0]')
axs[0, 1].plot(x, y, 'tab:orange')
axs[0, 1].set_title('Axis [0, 1]')
axs[1, 0].plot(x, -y, 'tab:green')
axs[1, 0].set_title('Axis [1, 0]')
axs[1, 1].plot(x, -y, 'tab:red')
axs[1, 1].set_title('Axis [1, 1]')

for ax in axs.flat:
    ax.set(xlabel='x-label', ylabel='y-label')

# Hide x labels and tick labels for top plots and y ticks for right plots.
for ax in axs.flat:
    ax.label_outer()
Eixo [0, 0], Eixo [0, 1], Eixo [1, 0], Eixo [1, 1]

Você pode usar a descompactação de tupla também em 2D para atribuir todas as subtramas a variáveis ​​dedicadas:

fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2)
fig.suptitle('Sharing x per column, y per row')
ax1.plot(x, y)
ax2.plot(x, y**2, 'tab:orange')
ax3.plot(x, -y, 'tab:green')
ax4.plot(x, -y**2, 'tab:red')

for ax in fig.get_axes():
    ax.label_outer()
Compartilhando x por coluna, y por linha

Compartilhamento de eixos #

Por padrão, cada eixo é dimensionado individualmente. Assim, se os intervalos forem diferentes, os valores dos ticks das subparcelas não se alinham.

fig, (ax1, ax2) = plt.subplots(2)
fig.suptitle('Axes values are scaled individually by default')
ax1.plot(x, y)
ax2.plot(x + 1, -y)
Os valores dos eixos são dimensionados individualmente por padrão
[<matplotlib.lines.Line2D object at 0x7f2cfb007250>]

Você pode usar sharex ou sharey para alinhar o eixo horizontal ou vertical.

fig, (ax1, ax2) = plt.subplots(2, sharex=True)
fig.suptitle('Aligning x-axis using sharex')
ax1.plot(x, y)
ax2.plot(x + 1, -y)
Alinhando o eixo x usando sharex
[<matplotlib.lines.Line2D object at 0x7f2cfa993370>]

Definir sharex ou sharey para Truehabilitar o compartilhamento global em toda a grade, ou seja, também os eixos y de subplots empilhados verticalmente têm a mesma escala ao usar sharey=True.

fig, axs = plt.subplots(3, sharex=True, sharey=True)
fig.suptitle('Sharing both axes')
axs[0].plot(x, y ** 2)
axs[1].plot(x, 0.3 * y, 'o')
axs[2].plot(x, y, '+')
Compartilhando os dois eixos
[<matplotlib.lines.Line2D object at 0x7f2cfab12980>]

Para subplots que estão compartilhando eixos, um conjunto de rótulos de escala é suficiente. Os rótulos de marcação dos eixos internos são removidos automaticamente por sharex e sharey . Ainda resta um espaço vazio não utilizado entre as subtramas.

Para controlar com precisão o posicionamento dos subplots, pode-se criar explicitamente um GridSpeccom Figure.add_gridspec, e então chamar seu subplotsmétodo. Por exemplo, podemos reduzir a altura entre subparcelas verticais usando add_gridspec(hspace=0).

label_outeré um método útil para remover rótulos e marcações de subtramas que não estão na borda da grade.

fig = plt.figure()
gs = fig.add_gridspec(3, hspace=0)
axs = gs.subplots(sharex=True, sharey=True)
fig.suptitle('Sharing both axes')
axs[0].plot(x, y ** 2)
axs[1].plot(x, 0.3 * y, 'o')
axs[2].plot(x, y, '+')

# Hide x labels and tick labels for all but bottom plot.
for ax in axs:
    ax.label_outer()
Compartilhando os dois eixos

Além de Truee False, sharex e sharey aceitam os valores 'row' e 'col' para compartilhar os valores apenas por linha ou coluna.

fig = plt.figure()
gs = fig.add_gridspec(2, 2, hspace=0, wspace=0)
(ax1, ax2), (ax3, ax4) = gs.subplots(sharex='col', sharey='row')
fig.suptitle('Sharing x per column, y per row')
ax1.plot(x, y)
ax2.plot(x, y**2, 'tab:orange')
ax3.plot(x + 1, -y, 'tab:green')
ax4.plot(x + 2, -y**2, 'tab:red')

for ax in axs.flat:
    ax.label_outer()
Compartilhando x por coluna, y por linha

Se você deseja uma estrutura de compartilhamento mais complexa, pode primeiro criar a grade de eixos sem compartilhamento e, em seguida, chamar axes.Axes.sharexou axes.Axes.shareyadicionar informações de compartilhamento a posteriori.

fig, axs = plt.subplots(2, 2)
axs[0, 0].plot(x, y)
axs[0, 0].set_title("main")
axs[1, 0].plot(x, y**2)
axs[1, 0].set_title("shares x with main")
axs[1, 0].sharex(axs[0, 0])
axs[0, 1].plot(x + 1, y + 1)
axs[0, 1].set_title("unrelated")
axs[1, 1].plot(x + 2, y + 2)
axs[1, 1].set_title("also unrelated")
fig.tight_layout()
principal, não relacionado, compartilha x com principal, também não relacionado

Eixos polares #

O parâmetro subplot_kw de pyplot.subplotscontrola as propriedades da subtrama (consulte também Figure.add_subplot). Em particular, isso pode ser usado para criar uma grade de eixos polares.

fig, (ax1, ax2) = plt.subplots(1, 2, subplot_kw=dict(projection='polar'))
ax1.plot(x, y)
ax2.plot(x, y ** 2)

plt.show()
demonstração de subtramas

Tempo total de execução do script: (0 minutos 7,774 segundos)

Galeria gerada por Sphinx-Gallery