web-dev-qa-db-fra.com

Différence entre ax.set_xlabel () et ax.xaxis.set_label () dans MatplotLib 3.0.1

(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.

enter image description here

AJOUTER 1

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 .

6
smwikipedia

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:

enter image description here

3
DavidG