Alinear xticklabels rotados con sus respectivos xticks

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

Estoy rotando las tags 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 tags de texto. Lo que hace que parezca que están desplazados a la derecha.

He intentado usar esto en su lugar:

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

… pero no hace lo que yo quería. Y "anchor" parece ser el único valor permitido para el parámetro rotation_mode .

Ejemplo

Puede establecer la alineación horizontal de ticklabels, vea el ejemplo a continuación. Si imagina una caja rectangular alrededor de la etiqueta girada, ¿qué lado del rectángulo desea alinear con el punto de marcación?

Dada su descripción, quiere: 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]) 

enter image description here

Rotar las tags es ciertamente posible. Sin embargo, tenga en cuenta que al hacerlo, se reduce la legibilidad del texto. Una alternativa es alternar las posiciones de las tags 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) 

enter image description here

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

Una alternativa fácil y sin bucles es usar la propiedad xticks Text como un argumento de palabra clave para xticks [1]. En el siguiente, en la línea comentada, xticks alineación de los xticks 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() 

( yticks ya alinea el borde derecho con el tic por defecto, pero para xticks el valor predeterminado parece ser “centro”).

[1] Encontrará eso descrito en la documentación de xticks si busca la frase “Propiedades del texto”.