Por que muitos exemplos usam `fig, ax = plt.subplots ()` em Matplotlib / pyplot / python

267

Estou aprendendo a usar matplotlibestudando exemplos, e muitos exemplos parecem incluir uma linha como a seguinte antes de criar um único gráfico ...

fig, ax = plt.subplots()

Aqui estão alguns exemplos...

Vejo essa função usada muito, mesmo que o exemplo esteja apenas tentando criar um único gráfico. Existe alguma outra vantagem? A demonstração oficial de subplots()também é usada f, ax = subplotsna criação de um único gráfico, e só faz referência a machado depois disso. Este é o código que eles usam.

# Just a figure and one subplot
f, ax = plt.subplots()
ax.plot(x, y)
ax.set_title('Simple plot')
neelshiv
fonte
11
bem, é curto, conciso e você obtém uma referência dois, figura e eixo, em uma única etapa. É pythônico, porque é bonita :)
cel

Respostas:

325

plt.subplots()é uma função que retorna uma tupla contendo uma figura e eixos de objetos. Portanto, ao usar fig, ax = plt.subplots()você descompacta essa tupla nas variáveis fige ax. Ter figé útil se você deseja alterar os atributos no nível da figura ou salvar a figura como um arquivo de imagem posteriormente (por exemplo, com fig.savefig('yourfilename.png')). Você certamente não precisa usar o objeto de figura retornado, mas muitas pessoas o usam mais tarde, por isso é comum ver. Além disso, todos os objetos de eixos (os objetos que possuem métodos de plotagem) têm um objeto de figura pai de qualquer maneira, portanto:

fig, ax = plt.subplots()

é mais conciso do que isso:

fig = plt.figure()
ax = fig.add_subplot(111)
jonchar
fonte
8
Muito boa explicação. Aqui está o documento sobre ele - matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.subplots
bretcj7
2
Por que sempre usamos 111 como parâmetro na subtrama?
Priyansh
@Priyansh porque é herdada de Matlab sintaxe
pcko1
@Priyansh Nem sempre. Se você quiser 4 gráficos, poderá ax11, ax12, ax21, ax22usar fig.add_subplot(221)(ou 222, 223, 224, respectivamente).
Guimoute 11/02
49

Apenas um suplemento aqui.

A seguinte pergunta é: e se eu quiser mais subtramas na figura?

Como mencionado no Doc, podemos usar fig = plt.subplots(nrows=2, ncols=2)para definir um grupo de subparcelas com grade (2,2) em um objeto de figura.

Então, como sabemos, o fig, ax = plt.subplots()retorna uma tupla, vamos tentar fig, ax1, ax2, ax3, ax4 = plt.subplots(nrows=2, ncols=2)primeiro.

ValueError: not enough values to unpack (expected 4, got 2)

Isso gera um erro, mas não se preocupe, porque agora vemos que plt.subplots()realmente retorna uma tupla com dois elementos. O primeiro deve ser um objeto de figura e o outro deve ser um grupo de objetos de subparcelas.

Então, vamos tentar novamente:

fig, [[ax1, ax2], [ax3, ax4]] = plt.subplots(nrows=2, ncols=2)

e verifique o tipo:

type(fig) #<class 'matplotlib.figure.Figure'>
type(ax1) #<class 'matplotlib.axes._subplots.AxesSubplot'>

Obviamente, se você usar parâmetros como (nrows = 1, ncols = 4), o formato deverá ser:

fig, [ax1, ax2, ax3, ax4] = plt.subplots(nrows=1, ncols=4)

Portanto, lembre-se de manter a construção da lista igual à grade de subparcelas que definimos na figura.

Espero que isso seja útil para você.

Duskash
fonte
2
não se esqueça de adicionar plt.tight_layout () se suas subtramas têm títulos
Gota
12
E se você tiver muitas subparcelas? É mais fácil fazê-lo desta maneira: fig, axes = plt.subplots(nrows=10, ncols=3)e axes = axes.flatten(). Agora você pode se referir a cada subtrama pelo seu índice: axes[0], axes[1], ...
Guillaume
E se eu quiser que uma dessas subparcelas abranja várias colunas ou linhas? é factível com o comando subplots?
gota
1
@BallpointBen Não tenho certeza de que funcione se nrows=1, como então, axesfor devolvido plano com comprimento igual ancols
Ben
1
@BallpointBen Acabei de perceber que você pode consertar isso fazendo:fig, axes = plt.subplots(nrows=1, ncols=3, squeeze=False)
Ben
15

Como complemento à pergunta e às respostas acima, também há uma diferença importante entre plt.subplots()e plt.subplot(), observe a falta 's'no final.

Pode-se usar plt.subplots()para fazer todas as suas subparcelas de uma só vez e retornar a figura e os eixos (plural de eixo) das subparcelas como uma tupla. Uma figura pode ser entendida como uma tela em que você pinta seu esboço.

# create a subplot with 2 rows and 1 columns
fig, ax = plt.subplots(2,1)

Visto que você pode usar plt.subplot()se desejar adicionar as subparcelas separadamente. Retorna apenas o eixo de uma subtrama.

fig = plt.figure() # create the canvas for plotting
ax1 = plt.subplot(2,1,1) 
# (2,1,1) indicates total number of rows, columns, and figure number respectively
ax2 = plt.subplot(2,1,2)

No entanto, plt.subplots()é preferido porque oferece opções mais fáceis de personalizar diretamente toda a sua figura

# for example, sharing x-axis, y-axis for all subplots can be specified at once
fig, ax = plt.subplots(2,2, sharex=True, sharey=True)

Eixos compartilhados enquanto que, com plt.subplot(), será necessário especificar individualmente para cada eixo que pode se tornar complicado.

Light_B
fonte
1
sua linha de código ax3 = plt.subplot(2,1,3) não funcionará porque é 2 por 1, que possui apenas 2 gráficos.
Cloud Cho
1
obrigado, consertou. Houve outra alteração necessária no último bloco de código.
Light_B 16/08/19
3

Além das respostas acima, você pode verificar o tipo de objeto type(plt.subplots())que retorna uma tupla, por outro lado, type(plt.subplot())retornos matplotlib.axes._subplots.AxesSubplotque não podem ser descompactados.

John T
fonte
4
Bem-vindo ao Stack Overflow! Este é realmente um comentário, não uma resposta. Com um pouco mais de rep, você poderá postar comentários . Obrigado!
Miroslav Glamuzina 31/03/19