Aligning rotated xticklabels with their respective xticks

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

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 se cambian a la derecha.

He intentado 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_mode Parámetro.

Example

Pregunta hecha hace 11 años, 3 meses, 3 días - Por codecrusaderx58e2


8 Respuestas:

  • Puede establecer la alineación horizontal de las etiquetas de garrapata, ver el ejemplo a continuación. Si usted imagina una caja rectangular alrededor de la etiqueta rotada, ¿qué lado del rectángulo desea estar alineado con el punto de mira?

    Dada tu descripción, quieres: 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

    Respondida el Feb 13, 2013 a las 11:51 - por codecrusaderx58e2

    Votos positivos: 0 | Votos negativos: 0

  • ha='right' no es suficiente visualmente alinear las etiquetas con las garrapatas:

    • Para rotation=45, uso ambos ha='right' y rotation_mode='anchor'
    • Para otros ángulos, utilice un ScaledTranslation() en lugar

    rotation_mode='anchor'

    Si el ángulo de rotación es de aproximadamente 45°, combine ha='right' con rotation_mode='anchor':

    ax.set_xticks(ticks)
    ax.set_xticklabels(labels, rotation=45, ha='right', rotation_mode='anchor')
    

    O en matplotlib 3.5.0+, establecer garrapatas y etiquetas a la vez:

    ax.set_xticks(ticks, labels, rotation=45, ha='right', rotation_mode='anchor')
    

    anchored rotation


    ScaledTranslation()

    Si el ángulo de rotación es más extremo (por ejemplo, 70°) o simplemente desea un control más fino, el anclaje no funcionará bien. En su lugar, aplicar una transformación lineal:

    ax.set_xticks(ticks)
    ax.set_xticklabels(labels, rotation=70)
    
    # create -5pt offset in x direction
    from matplotlib.transforms import ScaledTranslation
    dx, dy = -5, 0
    offset = ScaledTranslation(dx / fig.dpi, dy / fig.dpi, fig.dpi_scale_trans)
    
    # apply offset to all xticklabels
    for label in ax.xaxis.get_majorticklabels():
        label.set_transform(label.get_transform() + offset)
    

    scaled translation

    Respondida el Feb 13, 2013 a las 12:01 - por cybermage

    Votos positivos: 0 | Votos negativos: 0

  • Rotar las etiquetas es ciertamente posible. Tenga en cuenta que hacerlo reduce la legibilidad del texto. Una alternativa es alternar posiciones de etiqueta 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 más antecedentes y alternativas, véase este post en mi blog

    Respondida el Feb 13, 2013 a las 12:10 - por codecrusaderx58e2

    Votos positivos: 0 | Votos negativos: 0

  • Una alternativa fácil, libre de bucles es utilizar la horizontalalignment Propiedad de texto como un argumento de palabra clave xticks[1]. En el siguiente, en la línea comentada, he forzado la xticks alineación para ser "derecha".

    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 correcto con la garrapata por defecto, pero para xticks el predeterminado parece ser "centro".)

    [1] Encontrarás lo que se describe en el documentación de xticks si buscas la frase "Propiedades de texto".

    Respondida el Feb 13, 2013 a las 12:16 - por quantumcoderd26d

    Votos positivos: 0 | Votos negativos: 0

  • Soy claramente tarde pero hay un ejemplo oficial que usa

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

    para rotar las etiquetas manteniendo correctamente alineadas con las garrapatas, que es tanto limpia como fácil.

    Véase: https://matplotlib.org/stable/gallery/images_contours_and_fields/image_annotated_heatmap.html

    Respondida el Feb 13, 2013 a las 12:22 - por compilerczar

    Votos positivos: 0 | Votos negativos: 0

  • La respuesta de @tdy está cerca de la perfección. Creo que una manera más rápida de que las etiquetas se vean bien es usar una combinación de los tres de las siguientes configuraciones:

    • ha='right'
    • va='top'
    • rotation_mode='anchor'

    De esta manera, no hay necesidad de trabajar con el ScaledTranslation. Esto parece funcionar bien con todos los ángulos de rotación.

    ax.set_xticklabels(labels, rotation=30, ha='right', va='top', rotation_mode='anchor')
    ``
    

    Respondida el Feb 13, 2013 a las 12:30 - por htmlhero

    Votos positivos: 0 | Votos negativos: 0

  • Para alinear correctamente las etiquetas giradas con sus respectivas garrapatas en el eje x, puedes probar lo siguiente:

    • Ajusta el valor de alineación horizontal de las etiquetas para que estén a la izquierda. Puedes usar el parámetro `ha='left'` al establecer las etiquetas de los xticks.
    python
    ax.set_xticks(xlabels_positions)
    ax.set_xticklabels(xlabels, rotation=45, ha='left')
    
    • Si el ajuste anterior no funciona como se espera, puedes probar haciendo un ajuste manual del texto de las etiquetas. Para hacer esto, puedes usar la función `set_xticklabels` con una función personalizada para ajustar el texto de las etiquetas según tus necesidades. Aquí tienes un ejemplo de cómo podrías hacerlo:

    ```python def adjust_xtick_labels(event=None): dx = 30 / 72.0 for label in ax.xaxis.get_majorticklabels(): label.set_horizontalalignment('right') label.set_x(label.get_window_extent().x0 - dx)

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

    Respondida el Feb 14, 2013 a las 11:55 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para alinear las etiquetas xticks rotadas con sus garrapatas respectivas, puedes utilizar el argumento horizontalalignment al establecer las etiquetas xticks. Este argumento especifica la alineación horizontal de las etiquetas en relación con sus posiciones de garrapatas.

    Aquí tienes el código modificado:

    python
    ax.set_xticks(xlabels_positions)
    ax.set_xticklabels(xlabels, rotation=45, horizontalalignment='center')
    

    Al establecer horizontalalignment='center', las etiquetas xticks se centrarán horizontalmente en sus posiciones de garrapatas, lo que dará como resultado una alineación correcta.

    Resultado:

    [Imagen de las etiquetas xticks alineadas correctamente con sus garrapatas]

    Respondida el Feb 14, 2013 a las 11:56 - por Gemini

    Votos positivos: 0 | Votos negativos: 0