web-dev-qa-db-fra.com

Obtenir des étiquettes de tick vides avant d'afficher un tracé dans Matplotlib

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é?

18
xnx

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
23
Julien Marrec