web-dev-qa-db-fra.com

Faire pivoter le texte de l'axe dans python matplotlib

Je n'arrive pas à comprendre comment faire pivoter le texte sur l'axe X. C'est un horodatage. Ainsi, à mesure que le nombre d'échantillons augmente, ils se rapprochent de plus en plus jusqu'à ce qu'ils se chevauchent. J'aimerais faire pivoter le texte de 90 degrés pour que les échantillons ne se rapprochent pas, ils ne se chevauchent pas.

Ci-dessous est ce que j'ai, cela fonctionne très bien, sauf que je ne peux pas comprendre 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')
234
tMC

Cela fonctionne pour moi:

plt.xticks(rotation=90)
376
scottlittle

Facile

Comme décrit ici , il existe une méthode existante dans la classe matplotlib.pyplotfigure 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 (c'est-à-dire .ax.plot(dates,ydata):

fig.autofmt_xdate()

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

Objets non datetime

Selon le commentaire de languitar, la méthode que j'ai suggérée pour une non-datetime xticks ne se mettrait pas à jour correctement lors d'un zoom, etc. Si ce n'est pas un objet datetime utilisé comme x données de l'axe, vous devez suivre réponse de Tommy :

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

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)
62
opiethehokie

Appart de

plt.xticks(rotation=90)

c'est aussi possible:

plt.xticks(rotation='vertical')
44
Matthew

Je suis venu avec un exemple similaire. Encore une fois, le mot-clé rotation est .. eh bien, c'est la clé.

from pylab import *
fig = figure()
ax = fig.add_subplot(111)
ax.bar( [0,1,2], [1,3,5] )
ax.set_xticks( [ 0.5, 1.5, 2.5 ] )
ax.set_xticklabels( ['tom','dick','harry'], rotation=45 ) ;
43
cjohnson318

Ma réponse est inspirée de celle de cjohnson318, mais je ne voulais pas fournir une liste d'étiquettes codées en dur; Je voulais faire la rotation des étiquettes existantes:

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

Si vous souhaitez appliquer une rotation à l'objet axes, le moyen le plus simple consiste à utiliser tick_params. Par exemple.

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

Référence de la documentation Matplotlib ici .

Ceci est utile lorsque vous avez un tableau d'axes renvoyé par plt.subplots et qu'il est plus pratique d'utiliser set_xticks parce que, dans ce cas, vous devez également définir les libellés de ticks. qui parcourent les tiques (pour des raisons évidentes)

20
kiril

Si vous utilisez plt:

plt.xticks(rotation=90)

En cas d'utilisation de pandas ou de seaborn pour tracer, en prenant ax comme axes de la parcelle:

ax.set_xticklabels(ax.get_xticklabels(), rotation=90)

Une autre façon de faire ce qui précède:

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

Beaucoup de réponses "correctes" ici mais je vais en ajouter une de plus puisque je pense que certains détails sont laissés de côté. Le PO a demandé une rotation de 90 degrés, mais je vais passer à 45 degrés, car lorsque vous utilisez un angle différent de zéro ou de 90, vous devez également modifier l'alignement horizontal. sinon, vos étiquettes seront mal centrées et un peu trompeuses (et je suppose que beaucoup de gens qui viennent ici veulent faire pivoter les axes sur autre chose que 90).

Plus facile/moins de code

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

Un autre moyen rapide (destiné aux objets de date mais semble fonctionner sur n’importe quelle étiquette; doutez que cela soit cependant recommandé):

fig.autofmt_xdate(rotation=45)

fig vous obtiendrez généralement de:

  • 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 souhaitez 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 à ce qui précède, mais effectue une boucle manuellement à 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 il est orienté objet, car nous modifions la propriété d'un objet ax spécifique.

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

Option 6

Cette option est simple, mais autant que je sache, vous ne pouvez pas définir l’alignement horizontal de l’étiquette de cette manière; une autre option serait peut-être préférable si votre angle n’est pas de 90.

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

Edit: On discute de ce "bogue" exact et un correctif est potentiellement prévu pour v3.2.0: https: // github .com/matplotlib/matplotlib/issues/13774

14
getup8
import pylab as pl
pl.xticks(rotation = 90)
8
Ishan Tomar

Cela dépendra de ce que vous complotez.

import matplotlib.pyplot as plt

 x=['long_text_for_a_label_a',
    'long_text_for_a_label_b',
    'long_text_for_a_label_c']
y=[1,2,3]
myplot = plt.plot(x,y)
for item in myplot.axes.get_xticklabels():
    item.set_rotation(90)

Pour pandas et les marins qui vous ont donné un objet Axes:

df = pd.DataFrame(x,y)
#pandas
myplot = df.plot.bar()
#seaborn 
myplotsns =sns.barplot(y='0',  x=df.index, data=df)
# you can get xticklabels without .axes cause the object are already a 
# isntance of it
for item in myplot.get_xticklabels():
    item.set_rotation(90)

Si vous devez faire pivoter les étiquettes, vous devrez peut-être également modifier la taille de la police. Vous pouvez utiliser font_scale=1.0 pour le faire.

3
Isac Junior

Pour faire pivoter le libellé de l'axe des abscisses sur 90 degrés pour tick dans ax.get_xticklabels (): tick.set_rotation (45)

0
Mudit