Mueva la etiqueta del eje X hacia abajo, pero no las marcas del eje X en matplotlib

2 minutos de lectura

avatar de usuario de victorhooi
victorhooi

Estoy usando Matplotlib para trazar un histograma. Usando los consejos de mi pregunta anterior: Matplotlib: etiquete cada contenedor, tengo más o menos resueltos los problemas.

Hay un problema final, anteriormente, la etiqueta del eje x (“Tiempo (en milisegundos)”) se representaba debajo de las marcas del eje x (0.00, 0.04, 0.08, 0.12, etc.)

Sin relleno - Etiqueta del eje debajo de las figuras

Usando el consejo de Joe Kingston (ver la pregunta anterior), intenté usar:

ax.tick_params(axis="x", pad=30)

Sin embargo, esto mueve las marcas del eje x (0,00, 0,04, 0,08, 0,12, etc.), así como la etiqueta del eje x (“Tiempo (en milisegundos)”):

30 Relleno: tanto la etiqueta del eje como las marcas de graduación se han movido

¿Hay alguna forma de mover solo la etiqueta del eje x debajo de las tres filas de figuras?

NB: es posible que deba abrir los PNG a continuación directamente: haga clic con el botón derecho en la imagen, luego Ver imagen (en FF) o Abrir imagen en una nueva pestaña (Chrome). El cambio de tamaño de la imagen realizado por SO las ha vuelto casi ilegibles.

use el parámetro del panel de etiquetas:

pl.xlabel("...", labelpad=20)

o configurarlo después de:

ax.xaxis.labelpad = 20

  • si uso esto y guardo la figura, la figura se recorta y ya no veo la etiqueta

    – El Hocko

    13 de enero de 2021 a las 14:28

Avatar de usuario de Matthias123
Matias123

Si la variable ax.xaxis._autolabelpos = True, matplotlib establece la posición de la etiqueta en la función _update_label_position en axis.py según (algunos extractos):

    bboxes, bboxes2 = self._get_tick_bboxes(ticks_to_draw, renderer)
    bbox = mtransforms.Bbox.union(bboxes)
    bottom = bbox.y0
    x, y = self.label.get_position()
    self.label.set_position((x, bottom - self.labelpad * self.figure.dpi / 72.0))

Puede establecer la posición de la etiqueta independientemente de las marcas usando:

    ax.xaxis.set_label_coords(x0, y0)

que establece _autolabelpos en False o como se mencionó anteriormente cambiando el parámetro labelpad.

  • Para la posteridad, matplotlib ahora tiene .set_label_coords que da un nivel similar de control

    – la mayoría de los cuadrados

    19 oct 2022 a las 22:19


En lugar de rellenar manualmente, intente asignar alineación vertical (va=):

ax.set_xlabel("x label", va="top");

Si modifica el relleno de la etiqueta manualmente como en la respuesta de @ HYRY, a veces, cuando guarda la figura, la etiqueta se recorta. Para incluir la etiqueta, establezca bbox_inches="tight" cuando usted llama savefig(). Por ejemplo:

plt.plot(range(10))
plt.xlabel("x label", labelpad=30);
plt.savefig('img.png', bbox_inches="tight");

Con la API OOP, lo mismo sería:

fig, ax = plt.subplots()
ax.plot(range(10))
ax.set_xlabel("x label", labelpad=30);
fig.savefig('img.png', bbox_inches="tight");

¿Ha sido útil esta solución?