J'ai un problème en essayant de faire tourner mes tiques de date dans matplotlib. Un petit exemple de programme est ci-dessous. Si j'essaye de faire pivoter les graduations à la fin, les graduations ne sont pas tournées. Si j'essaie de faire pivoter les graduations comme indiqué sous le commentaire «plante», alors la bibliothèque matplot plante.
Cela ne se produit que si les valeurs x sont des dates. Si je remplace la variable dates
par la variable t
dans l'appel à avail_plot
, l' xticks(rotation=70)
appel fonctionne très bien à l'intérieur 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()
python
matplotlib
Neal
la source
la source
Réponses:
Si vous préférez une approche non orientée objet, passez
plt.xticks(rotation=70)
à droite avant les deuxavail_plot
appels, par exempleCela définit la propriété de rotation avant de configurer les étiquettes. Puisque vous avez deux axes ici,
plt.xticks
devient confus après avoir fait les deux graphiques. Au moment oùplt.xticks
ne fait rien,plt.gca()
ne pas vous donner les axes que vous souhaitez modifier, et doncplt.xticks
, qui agit sur les axes actuels, ne va pas au travail.Pour une approche orientée objet n'utilisant pas
plt.xticks
, vous pouvez utiliseraprès les deux
avail_plot
appels. Cela définit la rotation sur les axes corrects spécifiquement.la source
plt.setp
vous pouvez définir plusieurs paramètres en les spécifiant comme arguments de mot-clé supplémentaires. 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 où.plt.setp
solution est complètement orientée objet. Si vous n'aimez pas le fait qu'il yplt
en ait, utilisezfrom matplotlib.artist import setp; setp(ax.get_xticklabels(), rotation=90)
plutôt.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 non plus le style orienté objet typique. Votre réponse est certainement la meilleure ici. Fondamentalement, tout ce qui a une fonction n'est pas orienté objet. Peu importe que vous importiezsetp
ou non.yticks
, et le code n'a pas du tout défini ax en dehors deavail_plot
...La solution fonctionne pour matplotlib 2.1+
Il existe une méthode d'axes
tick_params
qui peut modifier les propriétés des graduations. Il existe également en tant que méthode d'axe commeset_tick_params
Ou
En remarque, la solution actuelle mélange l'interface avec état (à l'aide de pyplot) avec l'interface orientée objet à l'aide de la commande
plt.xticks(rotation=70)
. Étant donné que le code de la question utilise l'approche orientée objet, il est préférable de s'en tenir à cette approche tout au long. La solution donne une bonne solution explicite avecplt.setp( axs[1].xaxis.get_majorticklabels(), rotation=70 )
la source
Une solution simple qui évite de boucler sur les ticklabes consiste simplement à utiliser
fig.autofmt_xdate()
Cette commande fait automatiquement pivoter les étiquettes de l'axe x et ajuste leur position. Les valeurs par défaut sont un angle de rotation de 30 ° et un alignement horizontal "à droite". Mais ils peuvent être modifiés dans l'appel de fonction
L'
bottom
argument supplémentaire est équivalent au paramètreplt.subplots_adjust(bottom=bottom)
, qui permet de définir le remplissage des axes inférieurs sur une valeur plus grande pour héberger les étiquettes pivotées.Donc, fondamentalement, ici, vous avez tous les paramètres dont vous avez besoin pour avoir un bel axe de date en une seule commande.
Un bon exemple peut être trouvé sur la page matplotlib.
la source
plt.setp
approche, soit faire une boucle sur les graduations (ce qui est essentiellement le même).twinx
) sont présents, cela déforme l'alignement entre les graduations et les étiquettes de graduation. Dans ce cas, la solution de Ted Petrou est meilleure.Une autre façon d'appliquer
horizontalalignment
etrotation
à chaque étiquette de graduation consiste à faire unefor
boucle sur les étiquettes de graduation que vous souhaitez modifier:Et voici un exemple si vous souhaitez contrôler l'emplacement des graduations majeures et mineures:
la source
Utilisez simplement
la source