¿Cómo hacer varios gráficos en una sola página usando matplotlib?

92

He escrito un código que abre 16 cifras a la vez. Actualmente, todos se abren como gráficos separados. Me gustaría que se abrieran todos en la misma página. No es el mismo gráfico. Quiero 16 gráficos separados en una sola página / ventana. Además, por alguna razón, el formato de los numbins y defaultreallimits no se mantiene más allá de la figura 1. ¿Necesito usar el comando subplot? No entiendo por qué tendría que hacerlo, pero no puedo imaginarme qué más haría.

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.
fuente

Respuestas:

17

Para responder a su pregunta principal, desea utilizar el comando subplot . Creo que cambiar plt.figure(i)a plt.subplot(4,4,i+1)debería funcionar.

las3rjock
fuente
202

La respuesta de las3rjock , que de alguna manera es la respuesta aceptada por el OP, es incorrecta: el código no se ejecuta, ni es una sintaxis matplotlib válida; esa respuesta no proporciona ningún código ejecutable y carece de información o sugerencia que el OP pueda encontrar útil para escribir su propio código para resolver el problema en el OP.

Dado que es la respuesta aceptada y ya ha recibido varios votos a favor, supongo que es necesaria una pequeña deconstrucción.

Primero, llamar a subtrama no le da múltiples parcelas; La subparcela se llama para crear una sola parcela, así como para crear varias parcelas. Además, "cambiar plt.figure (i)" no es correcto.

plt.figure () (en el que plt o PLT suele ser la biblioteca pyplot de matplotlib importada y recuperada como una variable global, plt o, a veces, PLT, así:

from matplotlib import pyplot as PLT

fig = PLT.figure()

la línea justo arriba crea una instancia de figura matplotlib; Luego, se llama al método add_subplot de este objeto para cada ventana de trazado (piense informalmente en un eje x e y que comprenda una sola subparcela). Usted crea (ya sea solo uno o para varios en una página), así

fig.add_subplot(111)

esta sintaxis es equivalente a

fig.add_subplot(1,1,1)

elija el que tenga sentido para usted.

A continuación, he enumerado el código para trazar dos gráficos en una página, uno encima del otro. El formateo se realiza mediante el argumento pasado a add_subplot . Observe que el argumento es ( 211 ) para la primera gráfica y ( 212 ) para la segunda.

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 uno de estos dos argumentos es una especificación completa para colocar correctamente las respectivas ventanas de gráficos en la página.

211 (que, de nuevo, también podría escribirse en forma de 3 tuplas como (2,1,1) significa dos filas y una columna de ventanas de la gráfica; el tercer dígito especifica el orden de esa ventana de la subparcela en particular en relación con las otras ventanas de la subparcela- -en este caso, este es el primer gráfico (que lo coloca en la fila 1), por lo tanto, el número de gráfico 1, fila 1 col 1.

El argumento pasado a la segunda llamada a add_subplot , difiere del primero solo por el dígito final (un 2 en lugar de un 1, porque este gráfico es el segundo gráfico (fila 2, columna 1).

Un ejemplo con más gráficos: si en cambio quisiera cuatro gráficos en una página, en una configuración de matriz de 2x2, llamaría al método add_subplot cuatro veces, pasando estos cuatro argumentos (221), (222), (223) y ( 224), para crear cuatro gráficos en una página a las 10, 2, 8 y 4 en punto, respectivamente y en este orden.

Observe que cada uno de los cuatro argumentos contiene dos encabezamientos 2, que codifican la configuración 2 x 2, es decir, dos filas y dos columnas.

El tercer dígito (más a la derecha) en cada uno de los cuatro argumentos codifica el orden de esa ventana de gráfico en particular en la matriz 2 x 2, es decir, fila 1 columna 1 (1), fila 1 columna 2 (2), fila 2 columna 1 (3), fila 2 columna 2 (4).

doug
fuente
1
add_subplot puede tomar un único argumento entero para pequeñas cantidades de subparcelas, pero una vez que necesite más de 9 subtramas, debe usar la versión de las otras respuestas que toma 3 argumentos enteros separados.
user1244215
1
puedo usar en fig.add_axes(rect)lugar de add_subplot?
Alcott
16
PLT? Nunca había visto que se usara antes
Darshan Chaudhary
3
Su primer párrafo aquí es evidentemente falso, como puede verificar ejecutando for i in range(16): plt.subplot(4, 4, i+1)y no observar ningún error de sintaxis. La respuesta es aceptada porque probablemente hizo lo que quería el OP.
chthonicdaemon
3
Ésta es una buena solución. Pero si quiero usar una variable para hacer un bucle, ¿cómo hacerlo?
Pengju Zhao
83

Dado que esta pregunta es de hace 4 años se han implementado cosas nuevas y entre ellas hay una nueva función plt.subplotsque es muy conveniente :

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

where axeses uno numpy.ndarrayde los objetos AxesSubplot, lo que hace que sea muy conveniente pasar por las diferentes subtramas simplemente usando índices de matriz [i,j].

Saullo GP Castro
fuente
¿Funciona esto también para los casos en los que necesito usar solo la API de matplotlib (debido a que la pantalla no está disponible y otras cosas divertidas)?
eudoxos
2
@eudoxos sí, debería, puede crear las subtramas como esta para imprimir múltiples gráficos en una página, por ejemplo, sin necesidad de mostrar lo que se está haciendo
Saullo GP Castro
12

Esto también funciona:

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

Traza 19 gráficos en total en una página. El formato es 5 hacia abajo y 4 a lo ancho.

FS.
fuente
4

La respuesta de @doug & FS. son muy buenas soluciones. Quiero compartir la solución para la iteración en 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
fuente
Si su marco de datos tiene columnas con nombre, deberá usar algo comofor i,col in enumerate(df.columns):
drevicko