web-dev-qa-db-fra.com

Comment définir mon xlabel à la fin de xaxis

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 
31
billyduc

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 Axisset_label_coordsmé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:enter image description here

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:

enter image description here

39
Yann

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

enter image description here

17
Joe Kington

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.

enter image description here

3
Dmitry Davydov

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()
0
Bastian