Parcelas de diferentes tamaños de Matplotlib

Necesito agregar dos subplots a una figura. Una subplot debe ser aproximadamente tres veces más ancha que la segunda (la misma altura). GridSpec esto usando GridSpec y el argumento colspan pero me gustaría hacerlo usando la figure para poder guardar en PDF. Puedo ajustar la primera figura utilizando el argumento del figsize del constructor, pero ¿cómo cambio el tamaño de la segunda gráfica?

Otra forma es usar la función de subplots y pasar la relación de ancho con gridspec_kw :

 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 f, (a0, a1) = plt.subplots(1,2, gridspec_kw = {'width_ratios':[3, 1]}) a0.plot(x,y) a1.plot(y,x) f.tight_layout() f.savefig('grid_figure.pdf') 

Puedes usar 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') 

trama resultante

pyplot el objeto de los axes pyplot para ajustar manualmente los tamaños sin usar 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() 

Probablemente la forma más sencilla es usar subplot2grid , que se describe en Personalizar la ubicación de la subplot usando 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]) 

entonces el ejemplo de bmu 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')