Je ne peux pas comprendre comment faire pivoter le texte sur l'axe X. C'est un horodatage, donc à mesure que le nombre d'échantillons augmente, ils se rapprochent de plus en plus jusqu'à ce qu'ils se chevauchent. Je voudrais faire pivoter le texte de 90 degrés afin que les échantillons se rapprochent, ils ne se chevauchent pas.
Ci-dessous ce que j'ai, cela fonctionne bien à l'exception 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')
ha
(alignement horizontal)Réponses:
Cela fonctionne pour moi:
la source
ax.plot(...)
puisplt.xticks(rotation=90)
Moyen facile
Comme décrit ici , il existe une méthode existante dans la
matplotlib.pyplot
figure
classe 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 (par exemple
ax.plot(dates,ydata)
: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 non-datetime
xticks
ne se mettrait pas à jour correctement lors du zoom, etc. Si ce n'est pas undatetime
objet utilisé comme données de votre axe X, vous devriez suivre la réponse de Tommy :la source
Beaucoup de réponses «correctes» ici, mais j'en ajouterai une de plus car je pense que certains détails sont laissés de côté. L'OP a demandé une rotation de 90 degrés, mais je vais passer à 45 degrés car lorsque vous utilisez un angle qui n'est pas nul ou 90, vous devez également modifier 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 pivoter les axes vers autre chose que 90).
Code le plus facile / le moins
Option 1
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 (il est destiné aux objets de date mais semble fonctionner sur n'importe quelle étiquette; doute que cela soit recommandé cependant):
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:
Option 3b
Si vous souhaitez obtenir la liste des étiquettes du tracé actuel:
Option 4
Similaire à ci-dessus, mais parcourez manuellement à la place.
Option 5
Nous utilisons toujours
pyplot
(asplt
) ici, mais il est orienté objet car nous modifions la propriété d'unax
objet spécifique .Option 6
Cette option est simple, mais AFAIK vous ne pouvez pas définir l'alignement horizontal de l'étiquette de cette façon, une autre option pourrait donc être meilleure si votre angle n'est pas de 90.
Edit: il y a une discussion sur ce "bug" exact et un correctif est potentiellement prévu pour
v3.2.0
: https://github.com/matplotlib/matplotlib/issues/13774la source
Essayez pyplot.setp. Je pense que vous pourriez faire quelque chose comme ça:
la source
Traceback (most recent call last): File "plotter.py", line 23, in <module> plt.setp(time, rotation=90) File "/usr/lib64/python2.7/site-packages/matplotlib/pyplot.py", line 183, in setp ret = _setp(*args, **kwargs) File "/usr/lib64/python2.7/site-packages/matplotlib/artist.py", line 1199, in setp func = getattr(o, funcName) AttributeError: 'datetime.datetime' object has no attribute 'set_rotation'
setp(subplot(111).get_xticklabels(), rotation=90)
fonctionne très bien avec le backend Qt4Agg. Dans mon cas, il est réinitialisé parplt.hist()
, donc je l'appelle après, maisplt.plot()
ne le réinitialise pas, donc vous devriez être ok.locs, labels = plt.xticks() plt.setp(labels, rotation=90)
juste avantplt.plot(time, delay)
et cela a bien fonctionné.Appart de
c'est aussi possible:
la source
plt.xticks(rotation=45) plt.savefig(nomefile,dpi=150, optimize=True) plt.clf()
J'ai trouvé un exemple similaire. Encore une fois, le mot-clé rotation est ... eh bien, c'est la clé.
la source
datetime
Ma réponse est inspirée de la réponse de cjohnson318, mais je ne voulais pas fournir une liste codée en dur d'étiquettes; Je voulais faire pivoter les étiquettes existantes:
la source
Si vous utilisez
plt
:En cas d'utilisation de pandas ou d'ours marins pour tracer, en supposant
ax
comme axes pour la parcelle:Une autre façon de faire ce qui précède:
la source
for tick in ax.get_xticklabels(): tick.set_rotation(45)
a fait l'affaire pour moi.Si vous souhaitez appliquer une rotation sur l'objet axes, la méthode la plus simple consiste à utiliser
tick_params
. Par exemple.Référence de la documentation de Matplotlib ici .
Ceci est utile lorsque vous avez un tableau d'axes tel que renvoyé par
plt.subplots
, et c'est plus pratique que d'utiliserset_xticks
car dans ce cas, vous devez également définir les étiquettes de tick, et aussi plus pratique que celles qui itèrent sur les ticks (pour des raisons évidentes)la source
pd_dataframe.plot().tick_params(axis='x', labelrotation=90)
.labelrotation=30
.la source
Cela dépendra de ce que vous complotez.
Pour les pandas et les mers qui vous donnent un objet Axes:
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 cela.la source
Pour faire pivoter l'étiquette de l'axe des x à 90 degrés
la source
La solution la plus simple consiste à utiliser:
mais aussi
par exemple pour les dates j'ai utilisé rotation = 45 et bas = 0,20 mais vous pouvez faire un test pour vos données
la source