Matplotlib subplots de diferentes tamaños

Necesito añadir dos subparcelas a una figura. Uno de los subplots debe ser aproximadamente tres veces más ancho que el segundo (con la misma altura). He conseguido esto usando GridSpec y el argumento colspan pero me gustaría hacerlo usando figure para poder guardar en PDF. Puedo ajustar la primera figura usando el argumento figsize en el constructor, pero ¿cómo puedo cambiar el tamaño del segundo gráfico?

Puede utilizar gridspec y figure:

import numpy as np
import matplotlib.pyplot as plt 
from matplotlib import gridspec

# generate some data
x = np.arange(0, 10, 0.2)
y = np.sin(x)

# plot it
fig = plt.figure(figsize=(8, 6)) 
gs = gridspec.GridSpec(1, 2, width_ratios=[3, 1]) 
ax0 = plt.subplot(gs[0])
ax0.plot(x, y)
ax1 = plt.subplot(gs[1])
ax1.plot(y, x)

plt.tight_layout()
plt.savefig('grid_figure.pdf')

gráfico resultante

Comentarios (0)

Probablemente la forma más sencilla es utilizar subplot2grid, descrito en Personalización de la ubicación del subplot mediante GridSpec.

ax = plt.subplot2grid((2, 2), (0, 0))

es igual a

import matplotlib.gridspec as gridspec
gs = gridspec.GridSpec(2, 2)
ax = plt.subplot(gs[0, 0])

así que el ejemplo de bmu's se convierte en:

import numpy as np
import matplotlib.pyplot as plt

# generate some data
x = np.arange(0, 10, 0.2)
y = np.sin(x)

# plot it
fig = plt.figure(figsize=(8, 6))
ax0 = plt.subplot2grid((1, 3), (0, 0), colspan=2)
ax0.plot(x, y)
ax1 = plt.subplot2grid((1, 3), (0, 2))
ax1.plot(y, x)

plt.tight_layout()
plt.savefig('grid_figure.pdf')
Comentarios (0)

Utilicé el objeto pyplot's ejes para ajustar manualmente los tamaños sin utilizar GridSpec:

import matplotlib.pyplot as plt
import numpy as np
x = np.arange(0, 10, 0.2)
y = np.sin(x)

# definitions for the axes
left, width = 0.07, 0.65
bottom, height = 0.1, .8
bottom_h = left_h = left+width+0.02

rect_cones = [left, bottom, width, height]
rect_box = [left_h, bottom, 0.17, height]

fig = plt.figure()

cones = plt.axes(rect_cones)
box = plt.axes(rect_box)

cones.plot(x, y)

box.plot(y, x)

plt.show()
Comentarios (2)