2010-07-25 18 views
8

si tengo una serie de subtramas con una columna y el número de filas, es decir .:ajuste de alturas de subtramas individuales en matplotlib en Python

plt.subplot(4, 1, 1) # first subplot 
plt.subplot(4, 1, 2) # second subplot 
# ... 

Cómo se puede regular la altura de las primeras subtramas N? Por ejemplo, si tengo 4 subparcelas, cada una en su propia fila, quiero que todas tengan el mismo ancho pero las primeras 3 subparcelas sean más cortas, es decir, tengan sus ejes y sean más pequeños y ocupen menos de la trama que el eje y de la última parcela en la fila. ¿Cómo puedo hacer esto?

gracias.

+0

Uso tight_layout. Este enlace tiene buenos ejemplos: http://matplotlib.org/users/tight_layout_guide.html. Para que funcione, debes cambiar la cantidad de higos, por ej. 'plt.figure (figsize = (10, 1.5 * plotsToPlot))' donde 'plotsToPlot' es el número de subtramas en una figura. – Dilawar

+0

Utilice el [kit de herramientas AxesGrid] (http://matplotlib.sourceforge.net/mpl_toolkits/axes_grid/users/overview.html#axesgrid). – vtorhonen

Respuesta

3

Existen varias formas de hacerlo. La forma más básica (y menos flexible) es simplemente llamar algo así como:

import matplotlib.pyplot as plt 
plt.subplot(6,1,1) 
plt.subplot(6,1,2) 
plt.subplot(6,1,3) 
plt.subplot(2,1,2) 

que le dará algo como esto: Unequal Subplots

Sin embargo, esto no es muy flexible. Si está usando matplotlib> = 1.0.0, investigue usando GridSpec. Es bastante agradable y es una forma mucho más flexible de trazar subtramas.

+1

Creo que esta respuesta es subóptima, la respuesta a continuación debe ser la aceptada – NameOfTheRose

+0

@ user2422503 - Tenga en cuenta esa fecha y la referencia a exactamente lo que sugiere la respuesta siguiente. En ese momento, subplot2grid/GridSpec/etc era muy nuevo y la mayoría de la gente usaba una versión matplotlib que no la contenía. Por lo tanto, mostré la solución más ampliamente disponible y brindé una solución más puntual y más limpia. –

+0

@ Joe Kington, lo siento – NameOfTheRose

14

Aunque esta pregunta es antigua, quería responder a una pregunta muy similar. La referencia de @ Joe a AxesGrid, fue la respuesta a mi pregunta, y tiene muy uso directo, así que quería ilustrar esa funcionalidad para que esté completa.

AxesGrid funcionalidad proporciona la capacidad de crear parcelas de diferente tamaño y colocarlos muy específica, a través de la subplot2grid funcionalidad:

import matplotlib.pyplot as plt 

ax1 = plt.subplot2grid((m, n), (row_1, col_1), colspan = width) 
ax2 = plt.subplot2grid((m, n), (row_2, col_2), rowspan = height) 

ax1.plot(...) 
ax2.plot(...) 

Tenga en cuenta que los valores máximos de row_n, col_n son m-1 y n-1 respectivamente, como cero indexación notación se utiliza.

Dirigiéndose específicamente a la pregunta, si hubiera 5 subparcelas totales, donde la última subtrama tiene el doble de altura que las demás, podríamos usar m=6.

ax1 = plt.subplot2grid((6, 1), (0, 0)) 
ax2 = plt.subplot2grid((6, 1), (1, 0)) 
ax3 = plt.subplot2grid((6, 1), (2, 0)) 
ax4 = plt.subplot2grid((6, 1), (3, 0)) 
ax5 = plt.subplot2grid((6, 1), (4, 0), rowspan=2) 
plt.show() 

Last Graph, twice the height

+2

gracias por publicar - Necesitaba hacer esto y es exactamente lo que estoy buscando. –

+1

Esto es realmente fácil y funciona mucho mejor que la respuesta aceptada – jjz

Cuestiones relacionadas