(Cela peut être une question naïve. Pardonnez-moi si c'est le cas.)
J'utilise Python 3.7.1 et MatplotLib 3.0.1.
Dans le code simple ci-dessous, j'ai utilisé différentes façons d'attribuer des étiquettes aux axes. Ils semblent équivalents d'un point de vue OO. Mais seule l'étiquette x axis
S'affiche. Pourquoi ?
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
x = np.linspace(-2,2,60)
y = np.linspace(-2,2,60)
xx, yy = np.meshgrid(x,y)
z = xx**2 + yy**3
surf = ax.plot_surface(xx, yy, z, cmap="viridis")
ax.set_xlabel('x axis') # <====== This works
ax.yaxis.set_label('y axis') # <====== This doesn't work
ax.zaxis.set_label('z axis') # <====== This doesn't work
Dans l'image ci-dessous, vous pouvez voir que seule l'étiquette x axis
Est affichée.
Selon ici , il semble que l'approche matplotlib.axis.XAxis.set_label()
devrait fonctionner.
Dans mon cas, le ax.xaxis
Est de type mpl_toolkits.mplot3d.axis3d.XAxis
. C'est un type un peu différent. Mais je pense que devrait également fonctionner .
Il y a plusieurs choses appelées "labels" dans matplotlib. Il y a par exemple étiquettes d'axe, définies via set_xlabel
, il y a des étiquettes de tick, définies via set_ticklabels
, et il existe des étiquettes d'artistes, définies via set_label
.
Chaque artiste dans matplotlib a un attribut label. Vous le rencontrez généralement lorsque vous définissez une étiquette pour qu'elle s'affiche dans la légende,
plt.plot(..., label="my label")
mais cela peut aussi être utile pour d'autres cas. Ce qui précède équivaut à
line, = plt.plot(...)
line.set_label("mylabel")
Ainsi, non seulement l'objet Line2D
Créé par plot
a une étiquette, mais également matplotlib.axis.XAxis
A une étiquette. C'est celui que vous définissez avec ax.yaxis.set_label
. Cependant, cela n'est pas pris en compte par défaut lors de la production d'une légende, donc son utilité est discutable pour l'utilisateur final.
Pour les étiquettes des axes, set_ylabel
Est vraiment la méthode à utiliser pour définir le ylabel. En interne, cela appellerait yaxis.set_label_text
, Donc comme indiqué correctement par @DavidG, vous pouvez remplacer ax.set_ylabel(..)
par ax.yaxis.set_label_text(..)
(sauf pour un argument supplémentaire labelpad
qui est pris par set_ylabel
, mais pas par set_label_text
.
En regardant la documentation que vous avez montrée pour matplotlib.axis.XAxis.set_label()
il semble que cela soit lié à l'attribution d'une étiquette à l'axe lui-même pour une utilisation potentielle dans une légende (voir la réponse de @ ImportanceOfBeingErnest pour plus d'explications )
Dans tous les cas, l'équivalent de ax.set_xlabel
est matplotlib.axis.Axis.set_label_text
Par conséquent, changer le code en:
ax.set_xlabel('x axis')
ax.yaxis.set_label_text('y axis')
ax.zaxis.set_label_text('z axis')
Donne la sortie souhaitée: