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

15voto

Stacey Points 1089

La classe des axes a une fonction set_yticklabels qui vous permet de définir les étiquettes de tic-tac, comme suit :

#ax is the axes instance
group_labels = ['control', 'cold treatment',
             'hot treatment', 'another treatment',
             'the last one']

ax.set_xticklabels(group_labels)

Je ne sais toujours pas pourquoi votre exemple ci-dessus n'a pas fonctionné.

10voto

MichaelSB Points 992

Cela fonctionne également dans matplotlib 3 :

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

plt.xticks(x1, squad, rotation=45)

5voto

dopexxx Points 638

Si vous ne travaillez pas avec fig y ax et que vous souhaitez modifier toutes les étiquettes (par exemple pour la normalisation), vous pouvez le faire :

labels, locations = plt.yticks()
plt.yticks(labels, labels/max(labels))

3voto

Jason Points 63

J'ai remarqué que toutes les solutions postées ici qui utilisent des set_xticklabels() ne préservent pas les compensation qui est un facteur d'échelle appliqué aux valeurs des ticks pour créer des étiquettes de ticks plus esthétiques. Par exemple, si les ticks sont de l'ordre de 0.00001 (1e-5), matplotlib ajoutera automatiquement un facteur d'échelle (ou offset ) de 1e-5 Les étiquettes de coche résultantes peuvent donc prendre la forme suivante 1 2 3 4 plutôt que 1e-5 2e-5 3e-5 4e-5 .

Voici un exemple :

En x est np.array([1, 2, 3, 4])/1e6 et y est y=x**2 . Il s'agit donc dans les deux cas de valeurs très faibles.

Colonne de gauche : changer manuellement les 1ère et 3ème étiquettes, comme suggéré par @Joe Kington. Notez que le décalage est perdu.

Milieu de colonne : similaire à ce que @iipr a suggéré, en utilisant un FuncFormatter .

Colonne de droite : Ma proposition de solution pour préserver l'offset.

Figure ici : enter image description here

Code complet ici :

import matplotlib.pyplot as plt
import numpy as np

# create some *small* data to plot
x = np.arange(5)/1e6
y = x**2

fig, axes = plt.subplots(1, 3, figsize=(10,6))

#------------------The set_xticklabels() solution------------------
ax1 = axes[0]
ax1.plot(x, y)
fig.canvas.draw()
labels = [item.get_text() for item in ax1.get_xticklabels()]

# Modify specific labels
labels[1] = 'Testing'
labels[3] = 'Testing2'
ax1.set_xticklabels(labels)
ax1.set_title('set_xticklabels()')

#--------------FuncFormatter solution--------------
import matplotlib.ticker as mticker

def update_ticks(x, pos):
    if pos==1:
        return 'testing'
    elif pos==3:
        return 'testing2'
    else:
        return x

ax2=axes[1]
ax2.plot(x,y)
ax2.xaxis.set_major_formatter(mticker.FuncFormatter(update_ticks))
ax2.set_title('Func Formatter')

#-------------------My solution-------------------
def changeLabels(axis, pos, newlabels):
    '''Change specific x/y tick labels

    Args:
        axis (Axis): .xaxis or .yaxis obj.
        pos (list): indices for labels to change.
        newlabels (list): new labels corresponding to indices in <pos>.
    '''

    if len(pos) != len(newlabels):
        raise Exception("Length of <pos> doesn't equal that of <newlabels>.")

    ticks = axis.get_majorticklocs()
    # get the default tick formatter
    formatter = axis.get_major_formatter()
    # format the ticks into strings
    labels = formatter.format_ticks(ticks)

    # Modify specific labels
    for pii, lii in zip(pos, newlabels):
        labels[pii] = lii

    # Update the ticks and ticklabels. Order is important here.
    # Need to first get the offset (1e-6 in this case):
    offset = formatter.get_offset()
    # Then set the modified labels:
    axis.set_ticklabels(labels)
    # In doing so, matplotlib creates a new FixedFormatter and sets it to the xaxis
    # and the new FixedFormatter has no offset. So we need to query the
    # formatter again and re-assign the offset:
    axis.get_major_formatter().set_offset_string(offset)

    return

ax3 = axes[2]
ax3.plot(x, y)

changeLabels(ax3.xaxis, [1, 3], ['Testing', 'Testing2'])
ax3.set_title('With offset')

fig.show()
plt.savefig('tick_labels.png')

Mise en garde Il apparaît que les solutions qui utilisent les set_xticklabels() y compris la mienne, s'appuie sur FixedFormatter qui est statique et ne réagit pas au redimensionnement de la figure. Pour observer l'effet, changez la figure pour une taille plus petite, par exemple fig, axes = plt.subplots(1, 3, figsize=(6,6)) et agrandir la fenêtre de la figure. Vous remarquerez que seule la colonne centrale réagit au redimensionnement et ajoute des points au fur et à mesure que la figure s'agrandit. Les colonnes de gauche et de droite ont des étiquettes vides (voir figure ci-dessous).

Deuxième mise en garde : J'ai également remarqué que si vos valeurs de tic-tac sont des flottants, l'appel à set_xticklabels(ticks) peut directement vous donner des chaînes de caractères peu esthétiques, telles que 1.499999999998 au lieu de 1.5 .

enter image description here

2voto

Aymen Alsaadi Points 139

Essayez ceci :

  fig,axis = plt.subplots(nrows=1,ncols=1,figsize=(13,6),sharex=True)
  axis.set_xticklabels(['0', 'testing', '10000', '20000', '30000'],fontsize=22)

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