2009-08-31 45 views
73

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.¿Cómo hacer varias parcelas en una sola página usando matplotlib?

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

Respuesta

11

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

+1

Véase la respuesta correcta a continuación. Esto no funciona. – Shanemeister

162

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 de 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 varias votaciones, supongo que es necesario realizar una pequeña deconstrucción.

En primer lugar, llamando subtrama hace no le dan múltiples parcelas; subtrama se llama para crear un único trazado, así como para crear varios trazados. Además, "cambiar plt.figure (i)" no es correcto.

plt.figure() (en la que PLT o PLT es por lo general de matplotlib biblioteca pyplot importados y rebote como una variable global, o, a veces PLT PLT, así:

from matplotlib import pyplot as PLT 

fig = PLT.figure() 

la línea justo más arriba crea una instancia de figura de matplotlib; luego se llama al método add_subplot de este objeto para cada ventana de trazado (se piensa informalmente en un eje y x & que comprende una sola subparcela). Se crea (ya sea uno o varios en una página), entonces

fig.add_subplot(111) 

esta sintaxis es equivalente a

fig.add_subplot(1,1,1) 

elegir el que tenga sentido para usted.

A continuación he enumerado el código para trazar dos trazados en una página, uno encima del otro. El formateo se realiza a través del argumento pasado a add_subplot. Observe que el argumento es () para la primera trama y () 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 colocar correctamente las respectivas ventanas de trazado en la página.

(que de nuevo, también podría ser escrita en forma 3-tupla como (2,1,1) significa dos filas y una columna de las ventanas de la trama, el tercer dígito especifica el pedido 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 llame al add_subplot, difiere del primero solo por el dígito final (un 2 en lugar de un 1, porque esta trama es la segunda trama (fila 2, col 1).

Un ejemplo con más parcelas: si en lugar que quería cuatro parcelas en una página, en una configuración de matriz de 2x2, que podría llamarse el método add_subplot cuatro veces, pasando en estos cuatro argumentos (221), (222), (223) y (224), para crear cuatro trazados 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 leads 2's, que codifica la configuración 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 en particular en la matriz 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).

+0

agradezco esta pregunta porque es clara y exhaustiva. pero necesito trazar 25 subparcela en un diseño de matriz de 5x5. Obtengo este error: __ValueError: el argumento para la subtrama debe ser de 3 dígitos .__ – nkint

+0

@nkint ¿Has descubierto cómo hacerlo? – pms

+1

add_subplot puede tomar un único argumento entero para un pequeño número de subparcelas, pero una vez que necesite más de 9 subparcelas, debe usar la versión de las otras respuestas que toma 3 argumentos enteros separados. – user1244215

9

Esto funciona también:

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

Traza las gráficas 19 en total en una sola página. El formato es de 5 y 4 abajo a través ..

67

Dado que esta cuestión es de 4 años hace cosas nuevas se han implementado y entre ellos hay un new function plt.subplots which is very convenient:

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

donde axes es una numpy.ndarray de objetos AxesSubplot , por lo que es muy conveniente pasar por las diferentes subtramas usando solo los índices de matriz [i,j].

+0

¿Funciona esto también para los casos en que necesito usar matplotlib API solamente (debido a que la pantalla no está disponible y otras cosas divertidas)? – eudoxos

+2

@eudoxos Sí, debería, puede crear las subtramas de esta manera para imprimir múltiples gráficos en una página, por ejemplo, sin necesidad de mostrar lo que se está haciendo –

+0

¿Por qué el voto a favor? –

1

@doug & La respuesta de FS. Es muy buena. 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() 
+0

Si su marco de datos tiene columnas nombradas, necesitará usar algo como 'for i, col in enumerate (df.columns):' – drevicko

Cuestiones relacionadas