Je veux que mon axe x ait l'étiquette comme ce format
0 1 2 3 4 5 Xlabel
mais j'essaie le code ci-dessous me résulte en 2 lignes
self.axes.set_xticks(np.arange(0,6,1))
self.axes.set_xlabel('Xlabel', fontsize=9,x=1,y=1)
=> mon résultat :(
0 1 2 3 4 5
Xlabel
Lors de la définition du xlabel, le paramètre x
attribue la position en unités d'axe, ainsi 0 correspond à l'origine et 1 au bord droit du tracé. y
est ignoré car il est censé être une valeur par défaut, juste en dessous des graduations.
Pour remplacer ce comportement, vous pouvez définir la position en unités d'axe à l'aide de Axis
set_label_coords
méthode . Vous pouvez utiliser d'autres unités en fournissant également une transformation.
Voici un exemple de ceci:
import matplotlib.pyplot as plt
import numpy as np
ax = plt.gca()
ax.set_xticks(np.arange(0,6,1))
label = ax.set_xlabel('Xlabel', fontsize = 9)
ax.xaxis.set_label_coords(1.05, -0.025)
plt.savefig('labelAtEnd.png')
plt.show()
Résultant en:
La valeur x (1,05) a été choisie pour positionner l'étiquette en dehors du cadre Axes. La valeur y (-0,025) a été choisie comme meilleure estimation de la position souhaitée. En utilisant une transformation, il peut être possible de positionner automatiquement le texte en ligne avec les étiquettes Tick
.
MODIFIER:
Voici un exemple étendu utilisant une transformation. Il n'est pas nécessairement plus utile d'utiliser la transformation du dernier marqueur, car elle ne prend pas en compte la taille du texte et son alignement. Donc, pour obtenir un effet quelque peu désiré, je devais 1) utiliser la même taille de police pour mon libellé x, 2) positionner l'alignement vertical (va) sur "haut" et 3) positionner l'alignement horizontal sur "gauche". La transformation pour chaque tick est définie pour les unités de données pour x (car il s'agit d'une xaxis) et les unités d'axe pour y (0 à 1), mais est déplacée par un remplissage fixe (en pixels) à partir de l'axe x.
import matplotlib.pyplot as plt
import numpy as np
ax = plt.gca()
ax.set_xticks(np.arange(0,6,1))
ax.set_yticks(np.arange(0,6,1))
label = ax.set_xlabel('xlabel', ha='left', va = 'top', )#fontsize = 9)
# need to draw the figure first to position the tick labels
fig = plt.gcf()
fig.draw(fig.canvas.get_renderer())
# get a tick and will position things next to the last one
ticklab = ax.xaxis.get_ticklabels()[0]
trans = ticklab.get_transform()
ax.xaxis.set_label_coords(5.1, 0, transform=trans)
plt.savefig('labelAtEnd2.png')
plt.show()
Cela se traduit par:
En plus de ce que @Yann a déjà dit, il est en fait plus facile de le faire avec annotate
. Il restera également dans la bonne position lors du zoom/panoramique.
import matplotlib.pyplot as plt
import matplotlib as mpl
ticklabelpad = mpl.rcParams['xtick.major.pad']
fig, ax = plt.subplots()
ax.set_xlim([0, 5])
# Add the label as annotation. The "5" is the padding betweent the right side
# of the axis and the label...
ax.annotate('XLabel', xy=(1,0), xytext=(5, -ticklabelpad), ha='left', va='top',
xycoords='axes fraction', textcoords='offset points')
plt.show()
Voici ma variante d'utilisation de la méthode @JoeKington . Je change le libellé de la dernière tique en nom de l'axe. Tout d'abord, je mets les dernières mesures en place pour vider les chaînes, puis j'utilise annotate (). J'ai utilisé annotate () parce que je dois contrôler la taille de la police du libellé de l'axe.
import numpy as np
import matplotlib.pyplot as plt
plt.xlim(50, 70)
plt.ylim(100, 250)
ax = plt.gca()
# clears last tick label
xticks = ax.get_xticks().tolist()
xticks[-1] = ''
ax.set_xticklabels(xticks)
yticks = ax.get_yticks().tolist()
yticks[-1] = ''
ax.set_yticklabels(yticks)
# sets axes labels on both ends
ax.annotate('$t$', xy=(0.98, 0), ha='left', va='top', xycoords='axes fraction', fontsize=20)
ax.annotate('$x$', xy=(0, 1), xytext=(-15,2), ha='left', va='top', xycoords='axes fraction', textcoords='offset points', fontsize=20)
plt.show(block=True)
Peut-être que quelqu'un connaît une manière plus élégante de le faire, parce que c'est une opération ridiculement complexe.
J'utilise la solution fournie par @JoeKington, avec l'extension d'avoir des propriétés de police d'étiquette imposées au texte produit par ax.annotate(...)
.
Ceci est important lorsque les étiquettes des axes sont formatées différemment des autres textes.
import matplotlib.pyplot as plt
import matplotlib as mpl
ticklabelpad = mpl.rcParams['xtick.major.pad']
fig, ax = plt.subplots()
ax.set_xlim([0, 5])
dx_in_points = 5
fontproperties = ax.xaxis.get_label().get_fontproperties()
ax.annotate('XLabel', xy=(1,0), xytext=(dx_in_points, -ticklabelpad), ha='left', va='top',
xycoords='axes fraction', textcoords='offset points', fontproperties=fontproperties)
plt.show()