Hay varias formas de hacerlo. La forma más fácil es explotar las etiquetas y y los títulos de la trama y luego usar fig.tight_layout()
para hacer espacio para las etiquetas. Alternativamente, puede colocar texto adicional en la ubicación correcta con annotate
y luego dejar espacio para él de forma semi-manual.
Si no tiene etiquetas y en sus ejes, es fácil aprovechar el título y la etiqueta y de la primera fila y columna de ejes.
import matplotlib.pyplot as plt
cols = ['Column {}'.format(col) for col in range(1, 4)]
rows = ['Row {}'.format(row) for row in ['A', 'B', 'C', 'D']]
fig, axes = plt.subplots(nrows=4, ncols=3, figsize=(12, 8))
for ax, col in zip(axes[0], cols):
ax.set_title(col)
for ax, row in zip(axes[:,0], rows):
ax.set_ylabel(row, rotation=0, size='large')
fig.tight_layout()
plt.show()
Si tiene etiquetas en Y, o si prefiere un poco más de flexibilidad, puede usarlas annotate
para colocar las etiquetas. Esto es más complicado, pero le permite tener títulos de gráficos individuales, ylabels, etc. además de las etiquetas de fila y columna.
import matplotlib.pyplot as plt
from matplotlib.transforms import offset_copy
cols = ['Column {}'.format(col) for col in range(1, 4)]
rows = ['Row {}'.format(row) for row in ['A', 'B', 'C', 'D']]
fig, axes = plt.subplots(nrows=4, ncols=3, figsize=(12, 8))
plt.setp(axes.flat, xlabel='X-label', ylabel='Y-label')
pad = 5
for ax, col in zip(axes[0], cols):
ax.annotate(col, xy=(0.5, 1), xytext=(0, pad),
xycoords='axes fraction', textcoords='offset points',
size='large', ha='center', va='baseline')
for ax, row in zip(axes[:,0], rows):
ax.annotate(row, xy=(0, 0.5), xytext=(-ax.yaxis.labelpad - pad, 0),
xycoords=ax.yaxis.label, textcoords='offset points',
size='large', ha='right', va='center')
fig.tight_layout()
fig.subplots_adjust(left=0.15, top=0.95)
plt.show()
is_first_col()
,is_last_col()
,is_first_row()
yis_last_row()
pueden ser también conveniente en este contexto.rotation = 90
La respuesta anterior funciona. Solo que no en la segunda versión de la respuesta, tienes:
for ax, row in zip(axes[:,0], rows): ax.annotate(col, xy=(0, 0.5), xytext=(-ax.yaxis.labelpad-pad,0), xycoords=ax.yaxis.label, textcoords='offset points', size='large', ha='right', va='center')
en vez de:
for ax, row in zip(axes[:,0], rows): ax.annotate(row,xy=(0, 0.5), xytext=(-ax.yaxis.labelpad-pad,0), xycoords=ax.yaxis.label, textcoords='offset points', size='large', ha='right', va='center')
fuente