J'ai des problèmes avec les étiquettes des axes qui se chevauchent les étiquettes des tiques dans matplotlib. J'ai essayé de repositionner les étiquettes "manuellement" en appliquant des transformations ou en appelant set_y (), mais en vain.
Voici un extrait qui reproduit le problème:
import matplotlib
matplotlib.use("TKAGG")
import matplotlib.pyplot as pyplot
import mpl_toolkits.mplot3d
figure = pyplot.figure()
figure.subplots_adjust(bottom=0.25, top=0.75)
axes = figure.gca(projection='3d')
xLabel = axes.set_xlabel('XXX xxxxxx xxxx x xx x')
yLabel = axes.set_ylabel('YY (y) yyyyyy')
zLabel = axes.set_zlabel('Z zzzz zzz (z)')
plot = axes.plot([1,2,3],[1,2,3])
pyplot.show()
Notez comment les étiquettes x et y se heurtent aux tiques. Puis-je résoudre ce problème avec élégance?
Je partage votre frustration. J'ai travaillé dessus pendant une bonne demi-heure et je suis arrivé nulle part. Les documents disent que set_xlabel prend un argument labelpad mais j'obtiens une erreur (AttributeError: propriété inconnue labelpad)! Le définir après coup ne fait rien, sur xaxis ou w_xaxis.
Voici une solution de contournement grossière:
import matplotlib
matplotlib.use("TKAGG")
import matplotlib.pyplot as pyplot
import mpl_toolkits.mplot3d
figure = pyplot.figure(figsize=(8,4), facecolor='w')
ax = figure.gca(projection='3d')
xLabel = ax.set_xlabel('\nXXX xxxxxx xxxx x xx x', linespacing=3.2)
yLabel = ax.set_ylabel('\nYY (y) yyyyyy', linespacing=3.1)
zLabel = ax.set_zlabel('\nZ zzzz zzz (z)', linespacing=3.4)
plot = ax.plot([1,2,3],[1,2,3])
ax.dist = 10
pyplot.show()
Dans les nouvelles versions de matplotlib, voici comment procéder:
ax.xaxis._axinfo['label']['space_factor'] = 2.8
Voir l'explication ici:
https://github.com/matplotlib/matplotlib/issues/361
Testé sur v1.4, devrait fonctionner dans les versions> 1.1 je crois.
J'ai vraiment besoin de suivre StackOverflow plus souvent. Je suis le mainteneur actuel de mplot3d. La raison pour laquelle les différentes astuces qui fonctionnent généralement dans les tracés 2D normaux ne fonctionnent pas pour les tracés 3D est que mplot3d a été initialement écrit avec des valeurs par défaut codées en dur. Il y avait aussi des bugs dans la façon dont mplot3d calculait l'angle de rendu des étiquettes.
v1.1.0 contient plusieurs correctifs pour améliorer l'état des choses. J'ai corrigé l'erreur de calcul des angles d'étiquette des axes et j'ai fait quelques ajustements à l'espacement. Pour la prochaine version, je souhaiterais que les axes 3D occupent plus que l'espacement des axes par défaut, car la valeur par défaut a été conçue pour tenir compte du fait que les étiquettes de coche et les étiquettes d'axes seraient en dehors des axes, ce qui n'est pas le cas pour mplot3d. . Étant donné que les espacements sont déterminés par des proportions relatives dans mplot3d, le fait d'avoir un espace plus petit pour travailler à l'intérieur force les étiquettes à se rapprocher.
En ce qui concerne les autres possibilités de solutions de rechange, veuillez consulter la note ici . Un avertissement juste, ce dictionnaire privé n'est pas destiné à être une solution permanente, mais plutôt un mal nécessaire jusqu'à ce que le refactor de mplot3d soit complet.
De plus, la v1.1.0 contient de nombreuses mises à jour de l'API de mplot3d. Veuillez consulter la documentation révisée ici .
Ajoutez ceci pour chaque axe, adaptez le nombre:
axes.yaxis.labelpad=30
Il est mentionné dans le lien par Adam Hughes comme ne fonctionnant pas, mais cela fonctionne pour moi.
Cela modifie le remplissage de toutes les étiquettes (x, y, z) en une seule fois. J'aime le plus cette approche:
from matplotlib import rcParams
rcParams['axes.labelpad'] = 20
En tant que pratique de conception, le texte transformé n'est pas très lisible. Je vous suggère d'utiliser des étiquettes pour votre axe, peut-être codées en couleur. Voici comment vous le faites dans matplotlib
import matplotlib
matplotlib.use("TKAGG")
import matplotlib.pyplot as pyplot
import mpl_toolkits.mplot3d
figure = pyplot.figure()
figure.subplots_adjust(bottom=0.25, top=0.75)
axes = figure.gca(projection='3d')
xLabel = axes.set_xlabel('X', fontsize=14, fontweight='bold', color='b')
yLabel = axes.set_ylabel('Y',fontsize=14, fontweight='bold', color='r')
zLabel = axes.set_zlabel('Z',fontsize=14, fontweight='bold', color='g')
x = pyplot.Rectangle((0, 0), 0.1, 0.1,fc='b')
y = pyplot.Rectangle((0, 0), 0.1, 0.1,fc='r')
z = pyplot.Rectangle((0, 0), 0.1, 0.1,fc='g')
handles, labels = axes.get_legend_handles_labels()
axes.legend((x,y,z),("XXXXXX","YYYYY","ZZZZZZ"),'best')
plot = axes.plot([1,2,3],[1,2,3])
pyplot.show()
Vous pouvez utiliser labelpad
après avoir tracé votre figure:
axes = fig.gca(projection='3d')
axes.xaxis.labelpad=20
axes.yaxis.labelpad=20
axes.zaxis.labelpad=20
Cela pourrait faire en sorte que les étiquettes d'axe sortent du tracé 3D, vous devez donc ajuster la distance à l'aide de la méthode dist
:
ax.dist = 13