seleccionar seleccion recorrer filtrar datos data columnas columna agregar python matplotlib subplot

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:

  1. 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 dibujar text fuera de las tramas.
  2. 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'')