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.
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])
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 ambosha='right'
yrotation_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'
conrotation_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')
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)
Respondida el Feb 13, 2013 a las 12:01 - por cybermage
Votos positivos: 0 | Votos negativos: 0 - Para
-
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)
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 clavexticks
[1]. En el siguiente, en la línea comentada, he forzado laxticks
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 paraxticks
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 argumentohorizontalalignment
al establecer las etiquetasxticks
. 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 etiquetasxticks
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