No Matplotlib, o que o argumento significa em fig.add_subplot (111)?

472

Às vezes me deparo com um código como este:

import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]
fig = plt.figure()
fig.add_subplot(111)
plt.scatter(x, y)
plt.show()

Qual produz:

Exemplo de plotagem produzida pelo código incluído

Eu tenho lido a documentação como louca, mas não consigo encontrar uma explicação para o 111. vezes eu vejo 212.

O que significa o argumento de fig.add_subplot()?

satisfeito
fonte

Respostas:

470

Esses são parâmetros de grade de subparcela codificados como um único inteiro. Por exemplo, "111" significa "grade 1x1, primeira subtrama" e "234" significa "grade 2x3, quarta subtrama".

Forma alternativa para add_subplot(111)is add_subplot(1, 1, 1).

Constantin
fonte
18
Existe alguma documentação detalhada sobre isso? Qual é a diferença entre uma grade 1x1 e uma grade 2x3 neste contexto?
Donatello
19
Grade 1x1 = 1 linha, 1 coluna. Grade 2x3 = 2 linhas, 3 colunas. O terceiro número começa em 1 e incrementa a linha primeiro. Veja a documentação do subplot () para mais informações.
Christian Alis
18
Como outros explicaram (mais de dois anos atrás), esse é um legado do matlab. Mas, para o bem dos futuros leitores, você deve saber que existe uma alternativa melhor, na forma do subplots()método.
jarondl
26
Documentação de legado subplot()é aqui e subplots()é aqui .
crayzeewulf
511

Eu acho que isso seria melhor explicado pela figura a seguir:

insira a descrição da imagem aqui

Para inicializar o acima, digite-se:

import matplotlib.pyplot as plt
fig = plt.figure()
fig.add_subplot(221)   #top left
fig.add_subplot(222)   #top right
fig.add_subplot(223)   #bottom left
fig.add_subplot(224)   #bottom right 
plt.show()
SaiyanGirl
fonte
19
Eu acho que a versão com vírgulas é muito mais intuitivo e legível do que a versão com números de 3 dígitos
endolith
Isso é ótimo, mostra como "posicionar subtramas em uma grade", seja uma grade 2x2 como o exemplo ilustrado acima ou uma grade de gráficos 4x4 etc. Mas alguém pode explicar o que determina o tamanho desses gráficos que são exibidos. Os padrões para (2,2,1) considero muito pequenos e talvez o dobro desse tamanho ou mais.
precisa
7
Isso é bastante útil. Essa imagem seria um pouco melhor se não fosse quadrada (2x2), mas de outra forma muito útil.
TravisJ
@TravisJ Uau, que coincidência! Eu estava pensando exatamente a mesma coisa cerca de uma hora antes de você escrever isso! Eu vou mudar isso em breve :)
SaiyanGirl
7
Resposta muito útil! Embora eu ache a edição imprecisa. O comportamento para abranger subtramas com instruções como 1: 2 ou [1 3] não é suportado pelo Matplotlib (pelo menos não em 1.5.0) e parece ser apenas o Matlab. (Observe que existem outras opções no Matplotlib para atingir esse comportamento, por exemplo, gridspec )
lab
39

A resposta de Constantin é imediata, mas para mais informações, esse comportamento é herdado do Matlab.

O comportamento do Matlab é explicado na seção Configuração da figura - Exibição de vários gráficos por figura da documentação do Matlab.

subtrama (m, n, i) quebra a janela da figura em uma matriz m por n de pequenas subparcelas e seleciona a subtrama para a plotagem atual. Os gráficos são numerados ao longo da linha superior da janela da figura, depois a segunda linha e assim por diante.

DaveTM
fonte
2
Este é matplotlib, não matlab.
Dom0 /
45
Muito do comportamento do matplotlibs é herdado do Matlab. Como a documentação do Matlab era melhor, pensei que poderia ajudar a explicar como essa chamada de função específica se comporta. Sim, você está correto, isso (pergunta) é sobre matplotlib. A documentação do subplot matplotlib é menos clara na minha opinião.
24512 DaveMe (
7
A documentação do MATLAB foi movida .
dotancohen
20

Minha solução é

fig = plt.figure()
fig.add_subplot(1, 2, 1)   #top and bottom left
fig.add_subplot(2, 2, 2)   #top right
fig.add_subplot(2, 2, 4)   #bottom right 
plt.show()

Grade 2x2 com mesclagem 1 e 3

yoonghm
fonte
15

insira a descrição da imagem aqui

import matplotlib.pyplot as plt
plt.figure(figsize=(8,8))
plt.subplot(3,2,1)
plt.subplot(3,2,3)
plt.subplot(3,2,5)
plt.subplot(2,2,2)
plt.subplot(2,2,4)

O primeiro código cria a primeira subtrama em um layout que possui 3 linhas e 2 colunas.

Os três gráficos na primeira coluna indicam as 3 linhas. O segundo gráfico vem logo abaixo do primeiro gráfico na mesma coluna e assim por diante.

As duas últimas plotagens têm argumentos (2, 2)que indicam que a segunda coluna possui apenas duas linhas, os parâmetros de posição se movem em linhas.

Pritz
fonte
10

fig.add_subplot(ROW,COLUMN,POSITION)

  • ROW = número de linhas
  • COLUMN = número de colunas
  • POSITION = posição do gráfico que você está plotando

Exemplos

`fig.add_subplot(111)` #There is only one subplot or graph  
`fig.add_subplot(211)`  *and*  `fig.add_subplot(212)` 

Existem 2 linhas no total, 1 coluna e, portanto, 2 subgráficos podem ser plotados. Sua localização é a 1ª. Há um total de 2 linhas, 1 coluna, portanto, 2 subgráficos podem ser plotados.

Rameez Ahmad Dar
fonte
2

O método add_subplot () possui várias assinaturas de chamada:

  1. add_subplot(nrows, ncols, index, **kwargs)
  2. add_subplot(pos, **kwargs)
  3. add_subplot(ax)
  4. add_subplot() <- desde 3.1.0

Chamadas 1 e 2:

As chamadas 1 e 2 alcançam a mesma coisa que as outras (até um limite, explicado abaixo). Pense neles como primeiro especificando o layout da grade com seus 2 primeiros números (2x2, 1x8, 3x4 etc.), por exemplo:

f.add_subplot(3,4,1) 
# is equivalent to:
f.add_subplot(341)

Ambos produzem um arranjo de subparcela de (3 x 4 = 12) subtramas em 3 linhas e 4 colunas. O terceiro número em cada chamada indica qual objeto de eixo retornar, começando em 1 no canto superior esquerdo, aumentando para a direita .

Este código ilustra as limitações do uso da chamada 2:

#!/usr/bin/env python3
import matplotlib.pyplot as plt

def plot_and_text(axis, text):
  '''Simple function to add a straight line
  and text to an axis object'''
  axis.plot([0,1],[0,1])
  axis.text(0.02, 0.9, text)

f = plt.figure()
f2 = plt.figure()

_max = 12
for i in range(_max):
  axis = f.add_subplot(3,4,i+1, fc=(0,0,0,i/(_max*2)), xticks=[], yticks=[])
  plot_and_text(axis,chr(i+97) + ') ' + '3,4,' +str(i+1))

  # If this check isn't in place, a 
  # ValueError: num must be 1 <= num <= 15, not 0 is raised
  if i < 9:
    axis = f2.add_subplot(341+i, fc=(0,0,0,i/(_max*2)), xticks=[], yticks=[])
    plot_and_text(axis,chr(i+97) + ') ' + str(341+i))

f.tight_layout()
f2.tight_layout()
plt.show()

subparcelas

Você pode ver com a chamada 1 no LHS que pode retornar qualquer objeto de eixo; no entanto, com a chamada 2 no RHS, você só pode retornar até o índice = 9 renderizando subparcelas j), k) e l) inacessíveis usando esta chamada.

Ou seja, ilustra este ponto da documentação:

pos é um número inteiro de três dígitos, em que o primeiro dígito é o número de linhas, o segundo o número de colunas e o terceiro o índice da subparcela. ie fig.add_subplot (235) é o mesmo que fig.add_subplot (2, 3, 5). Observe que todos os números inteiros devem ser menores que 10 para que este formulário funcione .


Ligue 3

Em raras circunstâncias, add_subplot pode ser chamado com um único argumento, uma instância de eixos de subparcela já criada na figura atual, mas não na lista de eixos da figura.


Ligue 4 (desde 3.1.0):

Se nenhum argumento posicional for passado, o padrão é (1, 1, 1).

isto é, reproduzir a chamada fig.add_subplot(111)na pergunta.

compuphys
fonte