Como fazer vários gráficos em uma única página usando matplotlib?

89

Eu escrevi um código que abre 16 figuras de uma vez. Atualmente, todos eles são abertos como gráficos separados. Eu gostaria que eles abrissem todos na mesma página. Não é o mesmo gráfico. Quero 16 gráficos separados em uma única página / janela. Além disso, por algum motivo, o formato dos numbins e limites padrão não ultrapassa a figura 1. Eu preciso usar o comando subplot? Não entendo por que deveria, mas não consigo descobrir o que mais eu faria?

import csv
import scipy.stats
import numpy
import matplotlib.pyplot as plt

for i in range(16):
    plt.figure(i)
    filename= easygui.fileopenbox(msg='Pdf distance 90m contour', title='select file', filetypes=['*.csv'], default='X:\\herring_schools\\')
    alt_file=open(filename)    
    a=[]
    for row in csv.DictReader(alt_file):
        a.append(row['Dist_90m(nmi)'])
    y= numpy.array(a, float)    
    relpdf=scipy.stats.relfreq(y, numbins=7, defaultreallimits=(-10,60))
    bins = numpy.arange(-10,60,10)
    print numpy.sum(relpdf[0])
    print bins
    patches=plt.bar(bins,relpdf[0], width=10, facecolor='black')
    titlename= easygui.enterbox(msg='write graph title', title='', default='', strip=True, image=None, root=None)
    plt.title(titlename)
    plt.ylabel('Probability Density Function')
    plt.xlabel('Distance from 90m Contour Line(nm)')
    plt.ylim([0,1])

plt.show()
FS.
fonte

Respostas:

15

Para responder à sua pergunta principal, você deseja usar o comando subplot . Acho que mudar plt.figure(i)para plt.subplot(4,4,i+1)deve funcionar.

las3rjock
fonte
199

A resposta de las3rjock , que de alguma forma é a resposta aceita pelo OP, está incorreta - o código não é executado, nem a sintaxe matplotlib válida; essa resposta não fornece código executável e carece de qualquer informação ou sugestão que o OP possa achar útil para escrever seu próprio código para resolver o problema no OP.

Dado que é a resposta aceita e já recebeu vários votos positivos, suponho que uma pequena desconstrução seja necessária.

Primeiro, chamando subtrama que não dar-lhe várias parcelas; subplot é chamado para criar um único gráfico, bem como para criar vários gráficos. Além disso, "alterar plt.figure (i)" não é correto.

plt.figure () (em que plt ou PLT é geralmente a biblioteca pyplot de matplotlib importada e rebote como uma variável global, plt ou às vezes PLT, assim:

from matplotlib import pyplot as PLT

fig = PLT.figure()

a linha logo acima cria uma instância de figura matplotlib; o método add_subplot desse objeto é então chamado para cada janela de plotagem (informalmente, pense em um eixo x e y compreendendo um único subplot). Você cria (seja apenas um ou para vários em uma página), assim

fig.add_subplot(111)

esta sintaxe é equivalente a

fig.add_subplot(1,1,1)

escolha aquele que faz sentido para você.

Abaixo, listei o código para plotar dois gráficos em uma página, um acima do outro. A formatação é feita por meio do argumento passado para add_subplot . Observe que o argumento é ( 211 ) para o primeiro gráfico e ( 212 ) para o segundo.

from matplotlib import pyplot as PLT

fig = PLT.figure()

ax1 = fig.add_subplot(211)
ax1.plot([(1, 2), (3, 4)], [(4, 3), (2, 3)])

ax2 = fig.add_subplot(212)
ax2.plot([(7, 2), (5, 3)], [(1, 6), (9, 5)])

PLT.show()

Cada um desses dois argumentos é uma especificação completa para colocar corretamente as respectivas janelas de plotagem na página.

211 (que, novamente, também poderia ser escrito na forma de 3 tuplas como (2,1,1) significa duas linhas e uma coluna de janelas de gráfico; o terceiro dígito especifica a ordem daquela janela de sub-gráfico em particular em relação às outras janelas de sub-gráfico- - neste caso, este é o primeiro gráfico (que o coloca na linha 1), portanto, o gráfico número 1, linha 1 col 1.

O argumento passado para a segunda chamada para add_subplot difere da primeira apenas pelo dígito final (2 em vez de 1, porque este gráfico é o segundo gráfico (linha 2, coluna 1).

Um exemplo com mais gráficos: se em vez disso você quisesse quatro gráficos em uma página, em uma configuração de matriz 2x2, você chamaria o método add_subplot quatro vezes, passando esses quatro argumentos (221), (222), (223) e ( 224), para criar quatro plotagens em uma página às 10, 2, 8 e 4 horas, respectivamente e nesta ordem.

Observe que cada um dos quatro argumentos contém dois 2's iniciais - que codificam a configuração 2 x 2, ou seja, duas linhas e duas colunas.

O terceiro dígito (mais à direita) em cada um dos quatro argumentos codifica a ordem dessa janela de gráfico particular na matriz 2 x 2 - ou seja, linha 1 col 1 (1), linha 1 col 2 (2), linha 2 coluna 1 (3), linha 2 coluna 2 (4).

doug
fonte
1
add_subplot pode aceitar um único argumento inteiro para pequenos números de subplots, mas uma vez que você precisa de mais de 9 subplots, você deve usar a versão das outras respostas que leva 3 argumentos inteiros separados.
user1244215
1
posso usar em fig.add_axes(rect)vez de add_subplot?
Alcott
15
PLT? Nunca vi isso sendo usado antes
Darshan Chaudhary
3
Seu primeiro parágrafo aqui é evidentemente falso, como você pode verificar executando for i in range(16): plt.subplot(4, 4, i+1)e não observar nenhum erro de sintaxe. A resposta é aceita porque provavelmente fez o que o OP queria.
chthonicdaemon
3
Esta é uma boa solução. Mas se eu quiser usar uma variável para fazer um loop, como fazer?
Pengju Zhao
83

Como esta pergunta é de 4 anos atrás, novas coisas foram implementadas e entre elas há uma nova função plt.subplotsque é muito conveniente :

fig, axes = plot.subplots(nrows=2, ncols=3, sharex=True, sharey=True)

onde axesé um numpy.ndarraydos objetos AxesSubplot, tornando muito conveniente percorrer os diferentes subplots usando apenas índices de array [i,j].

Saullo GP Castro
fonte
Isso funciona também para os casos em que preciso usar apenas a API matplotlib (devido ao display não estar disponível e outras coisas engraçadas)?
eudoxos
2
@eudoxos sim, deveria, você pode criar as subtramas assim para imprimir vários gráficos em uma página, por exemplo, sem precisar mostrar o que está sendo feito
Saullo GP Castro
12

Isso também funciona:

for i in range(19):
    plt.subplot(5,4,i+1) 

Ele traça 19 gráficos no total em uma página. O formato é 5 para baixo e 4 transversalmente.

FS.
fonte
4

A resposta de @doug & FS. são soluções muito boas. Quero compartilhar a solução para iteração em pandas.dataframe.

import pandas as pd
df=pd.DataFrame([[1, 2], [3, 4], [4, 3], [2, 3]])
fig = plt.figure(figsize=(14,8))
for i in df.columns:
    ax=plt.subplot(2,1,i+1) 
    df[[i]].plot(ax=ax)
    print(i)
plt.show()
Pengju Zhao
fonte
Se seu data frame tem colunas nomeadas, você precisará usar algo comofor i,col in enumerate(df.columns):
drevicko