subplots separation multiple gridspec example add_subplot python matplotlib

separation - subplot python grid



GridSpec con ejes compartidos en Python (2)

Esta solución a otro hilo sugiere usar gridspec.GridSpec lugar de plt.subplots . Sin embargo, cuando comparto hachas entre subparcelas, suelo usar una sintaxis como la siguiente

fig, axes = plt.subplots(N, 1, sharex=''col'', sharey=True, figsize=(3,18))

¿Cómo puedo especificar sharex y sharey cuando uso GridSpec ?


Ambas opciones de Joe me dieron algunos problemas: el primero, relacionado con el uso directo de figure.tight_layout lugar de figure.set_tight_layout() y, el último, con algunos backends ( UserWarning: tight_layout: retrocediendo al renderizador de Agg ). Pero la respuesta de Joe definitivamente me abrió camino hacia otra alternativa compacta. Este es el resultado de un problema cercano al de OP:

import matplotlib.pyplot as plt fig, axes = plt.subplots(nrows=2, ncols=1, sharex=''col'', sharey=True, gridspec_kw={''height_ratios'': [2, 1]}, figsize=(4, 7)) fig.set_tight_layout({''rect'': [0, 0, 1, 0.95], ''pad'': 1.5, ''h_pad'': 1.5}) plt.setp(axes, title=''Test'') fig.suptitle(''An overall title'', size=20) plt.show()


En primer lugar, hay una solución más fácil para su problema original, siempre y cuando esté de acuerdo con ser un poco impreciso. Simplemente reinicie la extensión superior de las subtramas a la predeterminada después de llamar a tight_layout :

fig, axes = plt.subplots(ncols=2, sharey=True) plt.setp(axes, title=''Test'') fig.suptitle(''An overall title'', size=20) fig.tight_layout() fig.subplots_adjust(top=0.9) plt.show()

Sin embargo, para responder a su pregunta, deberá crear las subtramas en un nivel ligeramente inferior para usar gridspec. Si desea replicar el ocultamiento de ejes compartidos como las subplots , deberá hacerlo manualmente, utilizando el argumento de Figure.add_subplot para Figure.add_subplot y ocultando los ticks duplicados con plt.setp(ax.get_yticklabels(), visible=False) .

Como ejemplo:

import matplotlib.pyplot as plt from matplotlib import gridspec fig = plt.figure() gs = gridspec.GridSpec(1,2) ax1 = fig.add_subplot(gs[0]) ax2 = fig.add_subplot(gs[1], sharey=ax1) plt.setp(ax2.get_yticklabels(), visible=False) plt.setp([ax1, ax2], title=''Test'') fig.suptitle(''An overall title'', size=20) gs.tight_layout(fig, rect=[0, 0, 1, 0.97]) plt.show()