Pregunta ¿Cómo hacer varias parcelas en una sola página usando matplotlib?


He escrito un código que abre 16 figuras a la vez. Actualmente todos se abren como gráficos separados. Me gustaría que 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 algún motivo, el formato de numbins y defaultreallimits no se mantiene en la figura 1 anterior. ¿Debo utilizar el comando subplot? No entiendo por qué tendría que hacerlo pero no puedo entender 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()

73
2017-08-31 19:17


origen


Respuestas:


Para responder a su pregunta principal, desea utilizar el subtrama mando. Creo que cambiando plt.figure(i) a plt.subplot(4,4,i+1) Deberia trabajar.


14
2017-08-31 19:19



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 válida la sintaxis matplotlib; esa respuesta no proporciona ningún código ejecutable y carece de cualquier información o sugerencia que el OP pueda encontrar útil al escribir su propio código para resolver el problema en el PO.

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

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

plt.figure () (en el cual plt o PLT usualmente son Matplotlib's biblioteca de pyplot importado y rebote 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; este objeto add_subplot luego se llama al método para cada ventana de trazado (se piensa informalmente en un eje xey que comprende una sola subparcela). Usted crea (ya sea solo uno o varios en una página), como

fig.add_subplot(111)

esta sintaxis es equivalente a

fig.add_subplot(1,1,1)

elige el que tenga sentido para ti.

A continuación he enumerado el código para trazar dos tramas en una página, una encima de la otra. El formateo se realiza mediante el argumento pasado a add_subplot. Observe que el argumento es (211) para la primera trama y (212) para el 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 uno de estos dos argumentos es una especificación completa para ubicar correctamente las ventanas de trazado respectivas 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 trama; el tercer dígito especifica el orden de esa ventana de subtrama particular relativa a las otras ventanas de subtrama; en este caso, esta es la primera gráfica (que la ubica en la fila 1), por lo tanto, la trama número 1, fila 1 col 1.

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

Un ejemplo con más parcelas: si en lugar de eso querías cuatro parcelas 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 en 10, 2, 8 y 4 en punto, respectivamente y en este orden.

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

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


166
2018-01-13 20:52



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

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

dónde axes es un numpy.ndarray de objetos AxesSubplot, por lo que es muy conveniente pasar por las diferentes subtramas usando solo índices de matriz [i,j].


68
2017-09-07 12:14



Esto también funciona:

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

Traza 19 gráficos totales en una página. El formato es 5 abajo y 4 a través ..


9
2018-01-14 14:51



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()

2
2017-07-21 05:12