2011-01-20 36 views
19

Tengo un problema con el trazado de múltiples subtramas. Me gustaría establecer la relación de aspecto FÍSICO de las subtramas a un valor fijo. En mi ejemplo, tengo 12 subtramas (4 filas y 3 columnas) en una figura de paisaje A4. Allí, todas las subtramas están bien ubicadas en la figura completa, y para todas las subtramas, la altura es casi igual al ancho.matplotlib - subtramas con relación de aspecto fija

Pero si cambio el diseño de mi figura a vertical, las subtramas se estiran verticalmente. Y esto es exactamente lo que no debería suceder. Me gustaría tener el mismo alto y ancho de las subtramas que en la figura del paisaje. ¿Existe la posibilidad de que la relación de aspecto de las subtramas permanezca igual?

Gracias de antemano, Peter

EDIT: Me han encontrado una solución. Pero esto sólo funciona para ejes no logarítmicas ...

aspectratio=1.0 
ratio_default=(ax.get_xlim()[1]-ax.get_xlim()[0])/(ax.get_ylim()[1]-ax.get_ylim()[0]) 
ax.set_aspect(ratio_default*aspectratio) 

Respuesta

15

En realidad, lo que está queriendo es bastante simple ... Sólo tiene que asegurarse de que adjustable se establece en 'box' sobre sus ejes, y usted tener una relación de aspecto establecida para los ejes (cualquier cosa que no sea 'auto').

Puede hacer esto con el kwarg adjustable cuando crea las subtramas. Alternativamente, puede hacer esto después de su creación llamando al ax.set_adjustable('box'), o llamando al ax.set_aspect(aspect, adjustable='box') (donde aspecto es 'equal' o un número).

Ahora, independientemente de cómo se cambie el tamaño de la figura, las subtramas mantendrán la misma relación de aspecto.

Por ejemplo:

import matplotlib.pyplot as plt 

fig = plt.figure() 
ax1 = fig.add_subplot(2,1,1, adjustable='box', aspect=0.3) 
ax2 = fig.add_subplot(2,1,2) 

ax1.plot(range(10)) 
ax2.plot(range(10)) 

plt.show() 

Ahora, comparar cómo la trama secundaria superior responde al cambio de tamaño, frente a la forma en la trama secundaria inferior responde:


La trama inicial alt text

Redimensionado a una disposición vertical: alt text

cambia de tamaño para una disposición horizontal: alt text

+0

Me corrigieron. Bueno saber. –

+0

Hola! Gracias por su respuesta. Desafortunadamente, esto establece solo la relación de aspecto de los ejes de las subtramas. Como tengo muchos rangos diferentes de mis ejes, tendría que establecer esta relación de aspecto para cada subtrama de forma individual.Entonces, lo que quería hacer era establecer la altura y el ancho de mis subtramas (y no solo los ejes) en una relación de aspecto específica. –

3

Su solución funciona para mí. Después de graficar los datos, que llamo la siguiente función:

def fixed_aspect_ratio(ratio): 
    ''' 
    Set a fixed aspect ratio on matplotlib plots 
    regardless of axis units 
    ''' 
    xvals,yvals = gca().axes.get_xlim(),gca().axes.get_ylim() 

    xrange = xvals[1]-xvals[0] 
    yrange = yvals[1]-yvals[0] 
    gca().set_aspect(ratio*(xrange/yrange), adjustable='box') 
+0

Esto funcionó bien para mí. Modifiqué la función para aceptar un argumento 'ax 'para poder aplicarlo a las subtramas. También reemplacé el 'gca(). Hachas' con' ax' y 'gca()' con 'ax'. – Steve

1

En respuesta a la observación acerca de la solución no funciona para parcelas logarítmicas en el montaje a la pregunta original - que necesita para adaptarse de la siguiente manera:

def fixed_aspect_ratio_loglog(ratio): 
    ''' 
    Set a fixed aspect ratio on matplotlib loglog plots 
    regardless of axis units 
    ''' 
    xvals,yvals = gca().axes.get_xlim(),gca().axes.get_ylim() 

    xrange = log(xvals[1])-log(xvals[0]) 
    yrange = log(yvals[1])-log(yvals[0]) 
    gca().set_aspect(ratio*(xrange/yrange), adjustable='box') 

(La adaptación para los diagramas de semilog debería ser ahora obvia)

Cuestiones relacionadas