308 votes

Modifier le texte de l'étiquette de la coche

Je souhaite apporter quelques modifications à quelques étiquettes de coche sélectionnées dans un graphique.

Par exemple, si je fais :

label = axes.yaxis.get_major_ticks()[2].label
label.set_fontsize(size)
label.set_rotation('vertical')

la taille de la police et l'orientation de l'étiquette de la coche sont modifiées.

Toutefois, si vous essayez :

label.set_text('Foo')

l'étiquette de la coche est no modifié. De même, si je le fais :

print label.get_text()

rien n'est imprimé.

Voici d'autres étrangetés. Quand j'ai essayé ceci :

import matplotlib.pyplot as plt
import numpy as np

axes = plt.figure().add_subplot(111)
t = np.arange(0.0, 2.0, 0.01)
s = np.sin(2*np.pi*t)
axes.plot(t, s)
for ticklabel in axes.get_xticklabels():
    print(ticklabel.get_text())

Seules les chaînes vides sont imprimées, mais le graphique contient des ticks étiquetés comme '0.0', '0.5', '1.0', '1.5' et '2.0'.

enter image description here

399voto

Joe Kington Points 68089

Attention : A moins que les ticklabels ne soient déjà définis comme une chaîne de caractères (comme c'est généralement le cas dans un boxplot par exemple), cela ne fonctionnera pas avec une version de matplotlib plus récente que 1.1.0 . Si vous travaillez à partir du master github actuel, cela ne fonctionnera pas. Je ne suis pas encore sûr de la nature du problème... Il peut s'agir d'un changement involontaire, ou non...

Normalement, vous devriez faire quelque chose de ce genre :

import matplotlib.pyplot as plt

fig, ax = plt.subplots()

# We need to draw the canvas, otherwise the labels won't be positioned and 
# won't have values yet.
fig.canvas.draw()

labels = [item.get_text() for item in ax.get_xticklabels()]
labels[1] = 'Testing'

ax.set_xticklabels(labels)

plt.show()

enter image description here

Pour comprendre la raison pour laquelle vous devez sauter à travers tant de cerceaux, vous devez comprendre un peu plus comment matplotlib est structuré.

Matplotlib évite délibérément de positionner "statiquement" les ticks, etc, à moins qu'on ne le lui demande explicitement. L'hypothèse est que vous voudrez interagir avec le tracé, et donc que les limites du tracé, des ticks, des ticklabels, etc. changeront dynamiquement.

Par conséquent, vous ne pouvez pas simplement définir le texte d'une étiquette de coche donnée. Par défaut, il est redéfini par le localisateur et le formateur de l'axe à chaque fois que le tracé est dessiné.

Toutefois, si les localisateurs et les formateurs sont statiques ( FixedLocator y FixedFormatter respectivement), les étiquettes restent inchangées.

C'est ce que set_*ticklabels o ax.*axis.set_ticklabels ne.

J'espère que cela explique un peu mieux pourquoi la modification d'une étiquette de coche individuelle est un peu compliquée.

Souvent, ce que vous voulez faire, c'est simplement annoter une certaine position. Dans ce cas, consultez annotate au lieu de cela.

162voto

rafaelvalle Points 31

On peut aussi le faire avec pylab y xticks

import matplotlib
import matplotlib.pyplot as plt
x = [0,1,2]
y = [90,40,65]
labels = ['high', 'low', 37337]
plt.plot(x,y, 'r')
plt.xticks(x, labels, rotation='vertical')
plt.show()

https://matplotlib.org/stable/gallery/ticks_and_spines/ticklabels_rotation.html

119voto

CT Zhu Points 12184

Dans les versions plus récentes de matplotlib Si vous ne définissez pas les étiquettes de coche avec une série d'éléments de type str les valeurs sont les suivantes '' par défaut (et lorsque le tracé est dessiné, les étiquettes sont simplement les valeurs des ticks). Sachant cela, pour obtenir le résultat souhaité, il faudrait quelque chose comme ceci :

>>> from pylab import *
>>> axes = figure().add_subplot(111)
>>> a=axes.get_xticks().tolist()
>>> a[1]='change'
>>> axes.set_xticklabels(a)
[<matplotlib.text.Text object at 0x539aa50>, <matplotlib.text.Text object at 0x53a0c90>, 
<matplotlib.text.Text object at 0x53a73d0>, <matplotlib.text.Text object at 0x53a7a50>, 
<matplotlib.text.Text object at 0x53aa110>, <matplotlib.text.Text object at 0x53aa790>]
>>> plt.show()

et le résultat : enter image description here

et maintenant, si vous vérifiez le _xticklabels Ils ne sont plus un groupe d'hommes et de femmes, mais un groupe d'hommes et de femmes. '' .

>>> [item.get_text() for item in axes.get_xticklabels()]
['0.0', 'change', '1.0', '1.5', '2.0']

Il fonctionne dans les versions de 1.1.1rc1 à la version actuelle 2.0 .

27voto

iipr Points 141

Cela fait un certain temps que cette question n'a pas été posée. A partir d'aujourd'hui ( matplotlib 2.2.2 ) et après quelques lectures et essais, je pense que la meilleure façon de procéder est la suivante :

Matplotlib dispose d'un module nommé ticker que "contient des classes qui permettent de configurer complètement la localisation et le formatage des tiques" . Pour modifier un tick spécifique du tracé, la procédure suivante fonctionne pour moi :

import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
import numpy as np 

def update_ticks(x, pos):
    if x == 0:
        return 'Mean'
    elif pos == 6:
        return 'pos is 6'
    else:
        return x

data = np.random.normal(0, 1, 1000)
fig, ax = plt.subplots()
ax.hist(data, bins=25, edgecolor='black')
ax.xaxis.set_major_formatter(mticker.FuncFormatter(update_ticks))
plt.show()

Histogram with random values from a normal distribution

Attention ! x est la valeur de la coche et pos est sa position relative dans l'ordre de l'axe. Remarquez que pos prend des valeurs à partir de 1 et non en 0 comme d'habitude lors de l'indexation.


Dans mon cas, j'essayais de formater le fichier y-axis d'un histogramme avec des valeurs en pourcentage. mticker possède une autre classe nommée PercentFormatter qui permet de le faire facilement sans avoir à définir une fonction distincte comme auparavant :

import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
import numpy as np 

data = np.random.normal(0, 1, 1000)
fig, ax = plt.subplots()
weights = np.ones_like(data) / len(data)
ax.hist(data, bins=25, weights=weights, edgecolor='black')
ax.yaxis.set_major_formatter(mticker.PercentFormatter(xmax=1.0, decimals=1))
plt.show()

Histogram with random values from a normal distribution

Dans ce cas xmax est la valeur des données qui correspond à 100 %. Les pourcentages sont calculés comme suit x / xmax * 100 C'est pourquoi nous fixons xmax=1.0 . En outre, decimals est le nombre de décimales à placer après le point.

22voto

Soham Points 311

Cela fonctionne :

import matplotlib.pyplot as plt

fig, ax1 = plt.subplots(1,1)

x1 = [0,1,2,3]
squad = ['Fultz','Embiid','Dario','Simmons']

ax1.set_xticks(x1)
ax1.set_xticklabels(squad, minor=False, rotation=45)

FEDS

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X