Date de tiques et de la rotation dans matplotlib
Je rencontre un problème en essayant d'obtenir ma date tiques tourné dans matplotlib. Un petit exemple de programme est ci-dessous. Si j'essaie de faire pivoter les tiques à la fin, les tiques ne pas obtenir de la rotation. Si j'essaie de faire pivoter les tiques, comme indiqué dans le commentaire "se bloque", puis matplot lib se bloque.
Cela se produit uniquement si les valeurs de x sont des dates. Si je remplace la variable dates
avec la variable t
dans l'appel à avail_plot
, le xticks(rotation=70)
appel fonctionne très bien à l'intérieur de avail_plot
.
Des idées?
import numpy as np
import matplotlib.pyplot as plt
import datetime as dt
def avail_plot(ax, x, y, label, lcolor):
ax.plot(x,y,'b')
ax.set_ylabel(label, rotation='horizontal', color=lcolor)
ax.get_yaxis().set_ticks([])
#crashes
#plt.xticks(rotation=70)
ax2 = ax.twinx()
ax2.plot(x, [1 for a in y], 'b')
ax2.get_yaxis().set_ticks([])
ax2.set_ylabel('testing')
f, axs = plt.subplots(2, sharex=True, sharey=True)
t = np.arange(0.01, 5, 1)
s1 = np.exp(t)
start = dt.datetime.now()
dates=[]
for val in t:
next_val = start + dt.timedelta(0,val)
dates.append(next_val)
start = next_val
avail_plot(axs[0], dates, s1, 'testing', 'green')
avail_plot(axs[1], dates, s1, 'testing2', 'red')
plt.subplots_adjust(hspace=0, bottom=0.3)
plt.yticks([0.5,],("",""))
#doesn't crash, but does not rotate the xticks
#plt.xticks(rotation=70)
plt.show()
- La création d'une parcelle avec des dates sur l'axe des x est une tâche commune - une honte, il n'y a pas plus complet exemples.
- Je me demande si ce n'est pas un doublon de stackoverflow.com/questions/10998621/...
Vous devez vous connecter pour publier un commentaire.
Si vous préférez un non-approche orientée-objet, déplacez plt.xticks(rotation=70) à droite avant les deux avail_plot les appels, par exemple,
Ceci définit la propriété de rotation avant de mettre en place les étiquettes. Puisque vous avez deux axes ici, plt.xticks devient confus après que vous avez fait pour les deux parcelles. Au point lors de la plt.xticks ne pas faire n'importe quoi, plt.gca() ne pas vous donner les axes que vous souhaitez modifier, et ainsi de plt.xticks, qui agit sur le courant axes, n'est pas d'aller travailler.
Pour une approche orientée-objet non pas à l'aide de plt.xticks, vous pouvez utiliser
après les deux avail_plot appels. Cela définit la vitesse de rotation sur la bonne axes en particulier.
plt.setp
vous pouvez définir plusieurs paramètres en les précisant que les mots clés supplémentaires arguments. lehorizontalalignment
kwarg est particulièrement utile lorsque vous faites pivoter les étiquettes de graduation:plt.setp( axs[1].xaxis.get_majorticklabels(), rotation=70, horizontalalignment='right' )
ax.tick_params(axis='x', rotation=70)
à n'importe quel endroit.plt.setp
solution est complètement orienté objet. Si vous n'aimez pas le fait qu'il y a quelquesplt
en elle, l'utiliserfrom matplotlib.artist import setp; setp(ax.get_xticklabels(), rotation=90)
à la place.plt.xticks
qui est pyplot. La documentation elle-même dit de ne pas mélanger les styles.plt.setp
est plus verbeux, mais pas le type de l'orienté objet style. Votre réponse est définitivement le meilleur ici. Fondamentalement, quelque chose avec une fonction n'est pas orienté objet. Il n'a pas d'importance si vous importezsetp
ou pas.yticks
, et le code n'a pas ax définies à l'extérieur deavail_plot
...f, axs = plt.subplots(2, sharex=True, sharey=True)
. Il y a exactement deux autres appels àplt
outreplt.show
je ne dirais pas que beaucoup de code utilise pyplot. Lesetp
solution est réellement bon et explicite.plt.xticks
ne l'est pas.Solution fonctionne pour matplotlib 2.1+
Il existe un des axes de la méthode
tick_params
qui peut changer tique propriétés. Il existe également un axe de la méthode d'set_tick_params
Ou
Comme une note de côté, la solution actuelle les mélanges de la dynamique de l'interface (à l'aide de pyplot) avec une interface orientée objet à l'aide de la commande
plt.xticks(rotation=70)
. Depuis que le code en question utilise l'approche orientée objet, il est préférable de s'en tenir à cette approche à travers. La solution ne donnent une bonne solution explicite avecplt.setp( axs[1].xaxis.get_majorticklabels(), rotation=70 )
Une solution de facilité qui évite de parcourir les ticklabes est simplement utiliser
fig.autofmt_xdate()
Cette commande tourne automatiquement la xaxis étiquettes et ajuste leur position. Les valeurs par défaut sont un angle de rotation de 30° et l'alignement horizontal "droit". Mais ils peuvent être modifiés dans l'appel de fonction
Supplémentaires
bottom
argument est équivalent à définirplt.subplots_adjust(bottom=bottom)
, qui permet de définir le fond axes de rembourrage pour une valeur plus grande pour accueillir la rotation ticklabels.Donc, fondamentalement, vous avez ici tous les paramètres dont vous avez besoin pour avoir un joli axe de dates en une seule commande.
Un bon exemple peuvent être trouvés sur le matplotlib page.
Une autre manière d'appliquer
horizontalalignment
etrotation
à chaque tick label est en train de faire unfor
en boucle sur les étiquettes de graduation que vous voulez changer:Et voici un exemple si vous voulez contrôler l'emplacement de la majeure et la mineure tiques: