1 votes

Rotation du texte de l'axe en python matplotlib

Je n'arrive pas à trouver comment faire tourner le texte sur l'axe X. Il s'agit d'un horodateur, donc lorsque le nombre d'échantillons augmente, ils se rapprochent de plus en plus jusqu'à se chevaucher. J'aimerais faire pivoter le texte de 90 degrés pour que les échantillons ne se chevauchent pas lorsqu'ils se rapprochent.

Voici ce que j'ai, qui fonctionne bien à l'exception du fait que je n'arrive pas à trouver comment faire pivoter le texte de l'axe X.

import sys

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import datetime

font = {'family' : 'normal',
        'weight' : 'bold',
        'size'   : 8}

matplotlib.rc('font', **font)

values = open('stats.csv', 'r').readlines()

time = [datetime.datetime.fromtimestamp(float(i.split(',')[0].strip())) for i in values[1:]]
delay = [float(i.split(',')[1].strip()) for i in values[1:]]

plt.plot(time, delay)
plt.grid(b='on')

plt.savefig('test.png')

734voto

scottlittle Points 4898

Cela fonctionne pour moi :

plt.xticks(rotation=90)

242voto

getup8 Points 3034

Beaucoup de réponses "correctes" ici mais je vais en ajouter une autre car je pense que certains détails sont oubliés dans plusieurs d'entre elles. L'OP a demandé une rotation de 90 degrés mais je vais changer pour 45 degrés parce que lorsque vous utilisez un angle qui n'est pas zéro ou 90, vous devez également changer l'alignement horizontal ; sinon vos étiquettes seront décentrées et un peu trompeuses (et je suppose que beaucoup de gens qui viennent ici veulent faire tourner les axes à autre chose que 90).

Code le plus facile / le moins facile

Option 1

plt.xticks(rotation=45, ha='right')

Comme mentionné précédemment, cela peut ne pas être souhaitable si vous préférez adopter l'approche orientée objet.

Option 2

Une autre méthode rapide (elle est destinée aux objets de type date mais semble fonctionner sur n'importe quelle étiquette ; je doute cependant que ce soit recommandé) :

fig.autofmt_xdate(rotation=45)

fig que vous obtenez habituellement :

  • fig = plt.gcf()
  • fig = plt.figure()
  • fig, ax = plt.subplots()
  • fig = ax.figure

Orienté objet / Traiter directement avec ax

Option 3a

Si vous avez la liste des étiquettes :

labels = ['One', 'Two', 'Three']
ax.set_xticklabels(labels, rotation=45, ha='right')

Option 3b

Si vous voulez obtenir la liste des étiquettes du tracé actuel :

# Unfortunately you need to draw your figure first to assign the labels,
# otherwise get_xticklabels() will return empty strings.
plt.draw()
ax.set_xticklabels(ax.get_xticklabels(), rotation=45, ha='right')

Option 4

Semblable à la méthode ci-dessus, mais avec une boucle manuelle à la place.

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

Option 5

Nous utilisons toujours pyplot (comme plt ) ici, mais c'est orienté objet car nous changeons la propriété d'un objet spécifique. ax objet.

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

Option 6

Cette option est simple, mais AFAIK vous ne pouvez pas définir l'alignement horizontal de l'étiquette de cette façon, donc une autre option pourrait être meilleure si votre angle n'est pas de 90.

ax.tick_params(axis='x', labelrotation=45)

Edita: Ce "bug" a fait l'objet d'une discussion, mais aucun correctif n'a été publié (à ce jour). 3.4.0 ) : https://github.com/matplotlib/matplotlib/issues/13774

203voto

shootingstars Points 774

Un moyen simple

Comme décrit ici il existe une méthode existante dans le matplotlib.pyplot figure qui fait automatiquement pivoter les dates de manière appropriée pour votre figure.

Vous pouvez l'appeler après avoir tracé vos données (i.e. ax.plot(dates,ydata) :

fig.autofmt_xdate()

Si vous avez besoin de formater davantage les étiquettes, consultez le lien ci-dessus.

Objets non datés

Conformément à languitar La méthode que j'ai suggérée pour les données non temporelles est la suivante xticks ne se mettait pas à jour correctement lors des zooms, etc. S'il ne s'agit pas d'un datetime utilisé comme données de l'axe des x, vous devez suivre les étapes suivantes Tommy Réponse de la Commission :

for tick in ax.get_xticklabels():
    tick.set_rotation(45)

67voto

opiethehokie Points 1653

Essayez pyplot.setp. Je pense que vous pourriez faire quelque chose comme ça :

x = range(len(time))
plt.xticks(x,  time)
locs, labels = plt.xticks()
plt.setp(labels, rotation=90)
plt.plot(x, delay)

58voto

Matthew Points 706

Appart de

plt.xticks(rotation=90)

c'est également possible :

plt.xticks(rotation='vertical')

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X