Como obtenho várias subparcelas no matplotlib?

156

Estou um pouco confuso sobre como esse código funciona:

fig, axes = plt.subplots(nrows=2, ncols=2)
plt.show()

Como os figos, eixos funcionam neste caso? O que isso faz?

Também por que isso não funcionaria para fazer a mesma coisa:

fig = plt.figure()
axes = fig.subplots(nrows=2, ncols=2)
bugsyb
fonte
1
A partir do matplotlib 2.1, o segundo código funciona .
Paradoxo Fermi

Respostas:

210

Há várias maneiras de fazer isso. O subplotsmétodo cria a figura junto com as subparcelas que são armazenadas na axmatriz. Por exemplo:

import matplotlib.pyplot as plt

x = range(10)
y = range(10)

fig, ax = plt.subplots(nrows=2, ncols=2)

for row in ax:
    for col in row:
        col.plot(x, y)

plt.show()

insira a descrição da imagem aqui

No entanto, algo assim também funcionará, embora não seja tão "limpo", pois você está criando uma figura com subtramas e adicionando-as em cima delas:

fig = plt.figure()

plt.subplot(2, 2, 1)
plt.plot(x, y)

plt.subplot(2, 2, 2)
plt.plot(x, y)

plt.subplot(2, 2, 3)
plt.plot(x, y)

plt.subplot(2, 2, 4)
plt.plot(x, y)

plt.show()

insira a descrição da imagem aqui

ImportanceOfBeingErnest
fonte
4
Em vez de plot(x, y)eu ter meu gráfico vindo de uma função definida pelo usuário, que cria um gráfico com o networkx. Como usá-lo?
Sigur
É possível produzir várias subparcelas sem um loop for? Por exemplo, alguma solução vetorizada para plotar várias colunas de dados em gráficos separados? Isso é muito simples com o ggplot em R, mas parece impossível com o Python.
User2739472
3
você pode reduzir a dois loops em um por axn = ax.flatten()e depois for axes in axn: axes.plot(x,y)
wander95
@ wander95 OBRIGADO esta resposta não funciona para col = 1 ou linha = 1 sem você
Gulzar
48
import matplotlib.pyplot as plt

fig, ax = plt.subplots(2, 2)

ax[0, 0].plot(range(10), 'r') #row=0, col=0
ax[1, 0].plot(range(10), 'b') #row=1, col=0
ax[0, 1].plot(range(10), 'g') #row=0, col=1
ax[1, 1].plot(range(10), 'k') #row=1, col=1
plt.show()

insira a descrição da imagem aqui

Khalil Al Hooti
fonte
1
Eu recebo o que axé, mas não o que é fig. O que eles são?
Leevo 6/08/19
3
ax é na verdade uma matriz numpy. fig é a matplotlib.figure.Figureclasse através da qual você pode fazer muita manipulação na figura plotada. por exemplo, você pode adicionar a barra de cores a subparcelas específicas, alterar a cor do plano de fundo por trás de todas as subparcelas. você pode modificar o layout dessas subparcelas ou adicionar um novo machado pequeno a elas. de preferência, você pode querer um único título principal para todas as subparcelas que podem ser obtidas através do fig.suptitle(title)método finalmente, quando estiver satisfeito com o gráfico, você poderá salvá-lo usando o fig.savefigmétodo @Leevo
Khalil Al Hooti
21
  • Você também pode descompactar os eixos na chamada de subparcelas

  • E defina se você deseja compartilhar os eixos xey entre as subparcelas

Como isso:

import matplotlib.pyplot as plt
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2, sharex=True, sharey=True)
ax1.plot(range(10), 'r')
ax2.plot(range(10), 'b')
ax3.plot(range(10), 'g')
ax4.plot(range(10), 'k')
plt.show()

insira a descrição da imagem aqui

Colin Anthony
fonte
14

Você pode estar interessado no fato de que, a partir do matplotlib versão 2.1, o segundo código da pergunta também funciona bem.

No log de alterações :

A classe Figure agora possui o método subplots A classe Figure agora possui um método subplots () que se comporta da mesma forma que pyplot.subplots (), mas em uma figura existente.

Exemplo:

import matplotlib.pyplot as plt

fig = plt.figure()
axes = fig.subplots(nrows=2, ncols=2)

plt.show()
ImportanceOfBeingErnest
fonte
Eu recebo: AttributeError Traceback (última chamada mais recente) <ipython-input-168-ed25aa5255fa> em <module> () 2 3 fig = plt.figure () ----> 4 eixos = fig.subplots (nrows = 2 , ncols = 2) AttributeError: o objeto 'Figure' não tem atributo 'subplots' #
11898 Ludo Schmidt
1
@LudoSchmidt A resposta diz "a partir do matplotlib versão 2.1 ..."
ImportanceOfBeingErnest
11

leia a documentação: matplotlib.pyplot.subplots

pyplot.subplots()retorna uma tupla fig, axque é descompactada em duas variáveis ​​usando a notação

fig, axes = plt.subplots(nrows=2, ncols=2)

o código

fig = plt.figure()
axes = fig.subplots(nrows=2, ncols=2)

não funciona porque subplots()é uma função que pyplotnão é membro do objeto Figure.

Diziet Asahi
fonte