Je rencontre un problème similaire à celui signalé ici . Je ne comprends pas pourquoi le texte de l'étiquette à cocher est une chaîne vide:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,2*np.pi,100)
y = np.sin(x)**2
fig, ax = plt.subplots()
ax.plot(x,y)
labels = ax.get_xticklabels()
for label in labels:
print(label)
plt.show()
Production:
Text(0,0,'')
Text(0,0,'')
Text(0,0,'')
Text(0,0,'')
Text(0,0,'')
Text(0,0,'')
Text(0,0,'')
Text(0,0,'')
J'obtiens le même résultat avec ax.xaxis.get_ticklabels()
mais le graphique tracé montre huit graduations étiquetées sur l'axe des x lorsqu'il est enregistré ou affiché. Cependant, si je demande les étiquettes après j'ai montré l'intrigue, alors la liste labels
est correctement remplie. Bien sûr, il est un peu tard pour changer quoi que ce soit.
fig, ax = plt.subplots()
ax.plot(x,y)
plt.show()
labels = ax.get_xticklabels()
for label in labels:
print(label)
Production:
Text(0,0,'0')
Text(1,0,'1')
Text(2,0,'2')
Text(3,0,'3')
Text(4,0,'4')
Text(5,0,'5')
Text(6,0,'6')
Text(7,0,'7')
Pourquoi cela se produit-il (Mac OS X Yosemite, Matplotlib 1.5.1) et comment puis-je obtenir mes étiquettes avant d'afficher ou d'enregistrer mon tracé?
Vous avez correctement identifié le problème: avant d'appeler plt.show()
rien n'est explicitement défini. C'est parce que matplotlib évite le positionnement statique des ticks à moins qu'il ne le soit, car vous voudrez probablement interagir avec lui: si vous pouvez ax.set_xlim()
par exemple.
Dans votre cas, vous pouvez dessiner le canevas de figure avec fig.canvas.draw()
pour déclencher le positionnement des graduations, afin de pouvoir récupérer leur valeur.
Alternativement, vous pouvez explicitement définir les xticks qui, à leur tour, définiront l'axe sur FixedFormatter
et FixedLocator
et obtiendront le même résultat.
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,2*np.pi,100)
y = np.sin(x)**2
fig, ax = plt.subplots()
ax.plot(x,y)
ax.set_xlim(0,6)
# Must draw the canvas to position the ticks
fig.canvas.draw()
# Or Alternatively
#ax.set_xticklabels(ax.get_xticks())
labels = ax.get_xticklabels()
for label in labels:
print(label.get_text())
plt.show()
Out:
0
1
2
3
4
5
6