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')
Cela fonctionne pour moi:
plt.xticks(rotation=90)
Facile
Comme décrit ici , il existe une méthode existante dans la classe 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 (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)
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)
Appart de
plt.xticks(rotation=90)
c'est aussi possible:
plt.xticks(rotation='vertical')
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 ) ;
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)
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)
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)
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).
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.
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
ax
Si vous avez la liste des étiquettes:
labels = ['One', 'Two', 'Three']
ax.set_xticklabels(labels, rotation=45, ha='right')
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')
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')
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')
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
import pylab as pl
pl.xticks(rotation = 90)
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.
Pour faire pivoter le libellé de l'axe des abscisses sur 90 degrés pour tick dans ax.get_xticklabels (): tick.set_rotation (45)