2012-09-11 26 views
5

Estoy tratando de hacer una trama con 7 subtramas. En el momento que estoy tramando dos columnas, una con cuatro parcelas y el otro con tres, es decir, como esto: enter image description hereMatplotlib: Reposicionando una subparcela en una grilla de subtramas

estoy construyendo esta trama en la forma folowing:

#! /usr/bin/env python 
    import numpy as plotting 
    import matplotlib 
    from pylab import * 
    x = np.random.rand(20) 
    y = np.random.rand(20) 
    fig = figure(figsize=(6.5,12)) 
    subplots_adjust(wspace=0.2,hspace=0.2) 
    iplot = 420 
    for i in range(7): 
     iplot += 1 
     ax = fig.add_subplot(iplot) 
     ax.plot(x,y,'ko') 
     ax.set_xlabel("x") 
     ax.set_ylabel("y") 
    savefig("subplots_example.png",bbox_inches='tight') 

Sin embargo, para su publicación me Creo que esto se ve un poco feo, lo que me gustaría hacer es mover la última subtrama al centro entre las dos columnas. Entonces, ¿cuál es la mejor manera de ajustar la posición de la última subparcela para que esté centrada? Es decir. tener las primeras 6 subparcelas en una cuadrícula de 3X2 y la última subparcela debajo centrada entre las dos columnas. Si es posible, me gustaría ser capaz de mantener el bucle for por lo que simplemente puede utilizar:

if i == 6: 
     # do something to reposition/centre this plot  

Gracias,

Alex

+0

¿Tiene que ser una cuadrícula de 3x2? – Harpal

Respuesta

5

Si desea mantener el bucle, puede organizar sus parcelas con subplot2grid, lo que permite para un parámetro colspan:

#! /usr/bin/env python 
import numpy as plotting 
import matplotlib 
from pylab import * 
x = np.random.rand(20) 
y = np.random.rand(20) 
fig = figure(figsize=(6.5,12)) 
subplots_adjust(wspace=0.2,hspace=0.2) 
iplot = 420 
for i in range(7): 
    iplot += 1 
    if i == 6: 
     ax = subplot2grid((4,8), (i/2, 2), colspan=4) 
    else: 
     # You can be fancy and use subplot2grid for each plot, which dosen't 
     # require keeping the iplot variable: 
     # ax = subplot2grid((4,2), (i/2,i%2)) 

     # Or you can keep using add_subplot, which may be simpler: 
     ax = fig.add_subplot(iplot) 
    ax.plot(x,y,'ko') 
    ax.set_xlabel("x") 
    ax.set_ylabel("y") 
savefig("subplots_example.png",bbox_inches='tight') 

subplots in a grid with colspan

8

uso de la red de especificaciones (doc) con una cuadrícula de 4x4, y tienen cada tramo parcela 2 columnas tales como:

import matplotlib.gridspec as gridspec 
gs = gridspec.GridSpec(4, 4) 
ax1 = plt.subplot(gs[0, 0:2]) 
ax2 = plt.subplot(gs[0,2:]) 
ax3 = plt.subplot(gs[1,0:2]) 
ax4 = plt.subplot(gs[1,2:]) 
ax5 = plt.subplot(gs[2,0:2]) 
ax6 = plt.subplot(gs[2,2:]) 
ax7 = plt.subplot(gs[3,1:3]) 
fig = gcf() 
gs.tight_layout(fig) 
ax_lst = [ax1,ax2,ax3,ax4,ax5,ax6,ax7] 
+0

Esto funciona perfectamente. Puede controlar el espaciado entre cuadrículas, lo que permite el eje etiquetado, etc., usando técnicas matplotlib estándar - IE 'fig = plt.figure (figsize = (10,15))' luego de llamar a cada subtrama/grilla 'gs .tight_layout (fig) ' – AGS

+0

¡Una muy buena respuesta! ¡Gracias! –

Cuestiones relacionadas