Alinear etiquetas xtick rotadas con sus respectivas xticks

140

Verifique el eje x de la figura a continuación. ¿Cómo puedo mover las etiquetas un poco hacia la izquierda para que se alineen con sus respectivas marcas?

Estoy girando las etiquetas usando:

ax.set_xticks(xlabels_positions)
ax.set_xticklabels(xlabels, rotation=45)

Pero, como puede ver, la rotación se centra en el medio de las etiquetas de texto. Lo que hace que parezca que están desplazados hacia la derecha.

Intenté usar esto en su lugar:

ax.set_xticklabels(xlabels, rotation=45, rotation_mode="anchor")

... pero no hace lo que deseaba. Y "anchor"parece ser el único valor permitido para el rotation_modeparámetro.

Ejemplo

Filipe Correia
fuente

Respuestas:

202

Puede establecer la alineación horizontal de las marcas de verificación, consulte el siguiente ejemplo. Si imagina un cuadro rectangular alrededor de la etiqueta girada, ¿qué lado del rectángulo desea alinear con el punto de control?

Dada su descripción, desea: ha = 'right'

n=5

x = np.arange(n)
y = np.sin(np.linspace(-3,3,n))
xlabels = ['Ticklabel %i' % i for i in range(n)]

fig, axs = plt.subplots(1,3, figsize=(12,3))

ha = ['right', 'center', 'left']

for n, ax in enumerate(axs):
    ax.plot(x,y, 'o-')
    ax.set_title(ha[n])
    ax.set_xticks(x)
    ax.set_xticklabels(xlabels, rotation=40, ha=ha[n])

ingrese la descripción de la imagen aquí

Rutger Kassies
fuente
15
También puede usarlo xlabels = ax.get_xticklabels()si solo quiere usar las etiquetas existentes.
Ben
Gracias Rutger, este es un gran ejemplo, ¡me salvó el día!
alisa
13

Rotar las etiquetas es ciertamente posible. Sin embargo, tenga en cuenta que hacerlo reduce la legibilidad del texto. Una alternativa es alternar las posiciones de las etiquetas usando un código como este:

import numpy as np
n=5

x = np.arange(n)
y = np.sin(np.linspace(-3,3,n))
xlabels = ['Long ticklabel %i' % i for i in range(n)]


fig, ax = plt.subplots()
ax.plot(x,y, 'o-')
ax.set_xticks(x)
labels = ax.set_xticklabels(xlabels)
for i, label in enumerate(labels):
    label.set_y(label.get_position()[1] - (i % 2) * 0.075)

ingrese la descripción de la imagen aquí

Para obtener más antecedentes y alternativas, vea esta publicación en mi blog

Boris Gorelik
fuente
9

Una alternativa fácil y sin bucles es usar la horizontalalignmentpropiedad Text como argumento de palabra clave para xticks[1]. A continuación, en la línea comentada, he forzado la xticksalineación para que sea "correcta".

n=5
x = np.arange(n)
y = np.sin(np.linspace(-3,3,n))
xlabels = ['Long ticklabel %i' % i for i in range(n)]
fig, ax = plt.subplots()
ax.plot(x,y, 'o-')

plt.xticks(
        [0,1,2,3,4],
        ["this label extends way past the figure's left boundary",
        "bad motorfinger", "green", "in the age of octopus diplomacy", "x"], 
        rotation=45,
        horizontalalignment="right")    # here
plt.show()

( yticksya alinea el borde derecho con la marca de forma predeterminada, pero para xticksel valor predeterminado parece ser "centro").

[1] Lo encontrará descrito en la documentación de xticks si busca la frase "Propiedades de texto".

Jeffrey Benjamin Brown
fuente
3

Si no desea modificar las etiquetas xtick, simplemente puede usar:

plt.xticks(rotation=45)

pypypy
fuente
3
Pero tiene el mismo problema de etiquetas mal alineadas. Pero, para usar el truco de @RutgierCassies, uno puede usarplt.xticks(rotation=45,ha='right')
Frédéric Grosshans el