python - seleccion - Encabezados de fila y columna en las subparcelas de matplotlib
seleccionar columnas de un dataframe pandas (2)
Hay varias formas de hacer esto. La manera fácil es explotar las etiquetas y los títulos de la gráfica y luego usar fig.tight_layout()
para dejar espacio para las etiquetas. Alternativamente, puede colocar texto adicional en la ubicación correcta con annotate
y luego dejar espacio para ello de forma semi-manual.
Si no tiene etiquetas y en sus ejes, es fácil explotar 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 y, o si prefiere un poco más de flexibilidad, puede usar annotate
para colocar las etiquetas. Esto es más complicado, pero le permite tener títulos de parcelas individuales, etiquetas y demás, 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 # in points
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()
# tight_layout doesn''t take these labels into account. We''ll need
# to make some room. These numbers are are manually tweaked.
# You could automatically calculate them, but it''s a pain.
fig.subplots_adjust(left=0.15, top=0.95)
plt.show()
¿Cuál es la mejor práctica para agregar una fila y un encabezado de columna a una grilla de subparcelas generadas en un bucle en matplotlib
? Puedo pensar en una pareja, pero no especialmente clara:
- Para las columnas, con un contador para su ciclo, puede usar
set_title()
para la primera fila. Para las filas esto no funciona. Tendría que dibujartext
fuera de las tramas. - Agregue una fila adicional de subtramas en la parte superior y una columna adicional de subtramas en la izquierda, y dibuje texto en el medio de esa subtrama.
¿Puedes sugerir una mejor alternativa?
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 lugar 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'')