¿Cómo puedo girar xticklabels en matplotlib para que el espaciado entre cada xticklabel es igual?

Por ejemplo, con este código:

import matplotlib.pyplot as plt
import numpy as np

# Data + parameters
fontsize = 20
t = np.arange(0.0, 6.0, 1)
xticklabels = ['Full', 'token emb', 'char emb', 'char LSTM', 
               'token LSTM', 'feed forward','ANN']

# Plotting
fig = plt.figure(1)
ax = fig.add_subplot(111)
plt.plot(t, t)
plt.xticks(range(0, len(t) + 1))
ax.tick_params(axis='both', which='major', labelsize=fontsize)
ax.set_xticklabels(xticklabels, rotation = 45)
fig.savefig('test_rotation.png', dpi=300, format='png', bbox_inches='tight')

Puedo obtener:

¿Cómo puedo girar xticklabels en matplotlib para que el espaciado entre cada xticklabel es igual?

El espaciado entre cada xticklabel es desigual. Por ejemplo, el espaciado entre ‘Completo’ y ‘token emb’ es mucho más grande que el espacio entre ‘avance’ y ‘ANN’.

Yo uso Matplotlib 2.0.0 y Python 3.5 64 bits en Windows 7 SP1 x64 Ultimate.

  • Es el centrado de las etiquetas en el tickmarks. No creo que se pueda cambiar eso.

1 Comentario

  1. 36

    Las etiquetas se centra en la tickmark posición. Sus cuadros delimitadores son desiguales en ancho y puede que incluso se solapan, lo que hace que se vean desigualmente espaciados.

    ¿Cómo puedo girar xticklabels en matplotlib para que el espaciado entre cada xticklabel es igual?

    Ya que siempre iba a querer el ticklabels de un enlace a su tickmarks, cambiar el espaciado no es realmente una opción.

    Sin embargo es posible que desee alinear ellos el de la esquina superior derecha es la referencia para su ubicación por debajo de la garrapata.

    Utilizar el horizontalalignment o ha argumento y configurarlo para que "right":

    ax.set_xticklabels(xticklabels, rotation = 45, ha="right")

    Esto se traduce en la siguiente parcela:

    ¿Cómo puedo girar xticklabels en matplotlib para que el espaciado entre cada xticklabel es igual?

    Una alternativa puede ser la de mantener la ticklabels centrado horizontalmente, sino también el centro vertical. Esto conduce a una igualdad de espaciado, pero necesaria para ajustar su posición vertical con respecto al eje.

    ax.set_xticklabels(xticklabels, rotation = 45, va="center", position=(0,-0.28))

    ¿Cómo puedo girar xticklabels en matplotlib para que el espaciado entre cada xticklabel es igual?


    ¿Cómo puedo girar xticklabels en matplotlib para que el espaciado entre cada xticklabel es igual?

    Lo anterior puede ser utilizado si las garrapatas se especifican manualmente como en la pregunta (por ejemplo, a través de plt.xticks o a través de ax.set_xticks) o si una categoría de trama se utiliza.

    Si en lugar de las etiquetas se muestran automáticamente, una no debe usar set_xticklabels. Esto, en general, dejar que las etiquetas y marque las posiciones de sincronización, porque set_xticklabels establece el formateador de los ejes a una FixedFormatter, mientras que el localizador de estancias automático AutoLocator, o cualquier otra automática de localizador.

    En esos casos, el uso de plt.setp para establecer la rotación y alineación de las etiquetas existentes,

    plt.setp(ax.get_xticklabels(), ha="right", rotation=45)

    o en bucle encima de ellos para establecer las propiedades respectivas,

    for label in ax.get_xticklabels():
        label.set_ha("right")
        label.set_rotation(45)

    Un ejemplo sería

    import numpy as np; np.random.seed(42)
    import matplotlib.pyplot as plt
    
    t = np.arange("2018-01-01", "2018-03-01", dtype="datetime64[D]")
    x = np.cumsum(np.random.randn(len(t)))
    
    fig, ax = plt.subplots()
    ax.plot(t, x)
    
    for label in ax.get_xticklabels():
        label.set_ha("right")
        label.set_rotation(45)
    
    plt.tight_layout()
    plt.show()
    • Funciona a la perfección. Gracias!
    • Oh no, no hagas eso! He actualizado la respuesta para saber cómo hacerlo cuando se trama algo con máquina de correr.
    • Muchas gracias de nuevo!!! Tu explicación es muy clara. He actualizado el código para utilizar el bucle y establecer las propiedades (me han quitado mi comentario anterior, para evitar causar confusión).

Dejar respuesta

Please enter your comment!
Please enter your name here