Modifier les tiques texte de l'étiquette

je veux apporter quelques modifications à quelques étiquettes de tique sélectionnées dans une parcelle.

par exemple, si je le 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 tique sont changées.

Toutefois, si l'essai:

label.set_text('Foo')

l'étiquette de la tique est et non modifiée. Aussi si je le fais:

print label.get_text()

rien n'est imprimé.

Voici quelques étrangeté. Quand j'ai essayé ceci:

 from pylab import *
 axes = figure().add_subplot(111)
 t = arange(0.0, 2.0, 0.01)
 s = sin(2*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 la trame contient des tiques étiquetées comme '0.0', '0.5', '1.0', '1.5', et "2.0".

137
demandé sur Will Vousden 2012-06-28 16:20:00

7 réponses

mise en garde: à moins que les ticklabels ne soient déjà définis à une chaîne (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 avec le maître github actuel, ça ne marchera pas. Je ne suis pas sûr de ce que le problème est encore... Il peut être involontaire d'un changement, ou peut-être pas...

normalement, vous feriez quelque chose du 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 sur la façon dont matplotlib est structuré.

Matplotlib évite délibérément de faire un positionnement" statique " des tiques, etc., à moins que cela ne lui soit explicitement demandé. L'hypothèse est que vous voulez interagir avec l'intrigue, et donc les limites de l'intrigue, tiques, ticklabels, etc seront en train de changer dynamiquement.

donc, vous ne pouvez pas définir le texte d'une étiquette de graduation. Par défaut, il est re-défini par le Localisateur et le Formatteur de l'axe à chaque fois que le tracé est dessiné.

cependant, si les localisateurs et les formateurs sont définis comme statiques ( FixedLocator et FixedFormatter , respectivement), alors les étiquettes restent les mêmes.

C'est ce que set_*ticklabels ou ax.*axis.set_ticklabels fait.

avec un peu de chance, cela rend plus claire la raison pour laquelle changer une étiquette de tique individuelle est peu compliquée.

souvent, ce que vous voulez réellement faire est simplement annoter une certaine position. Dans ce cas, regardez dans annotate , à la place.

189
répondu Joe Kington 2014-12-07 22:27:21

dans les versions plus récentes de matplotlib , si vous ne définissez pas les étiquettes de tique avec un tas de valeurs str , ils sont '' par défaut (et quand le tracé est dessiner les étiquettes sont simplement les valeurs de tiques). Sachant cela, pour obtenir votre sortie désirée exigerait 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 cochez le _xticklabels , ils ne sont plus un groupe de '' .

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

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

72
répondu CT Zhu 2016-09-11 02:15:17

on peut aussi le faire avec pylab et xticks

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

http://matplotlib.org/examples/ticks_and_spines/ticklabels_demo_rotation.html

60
répondu rafaelvalle 2016-10-03 20:27:37

la classe axes a une fonction set_yticklabels qui vous permet de définir les étiquettes de tique, comme ceci:

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

ax.set_xticklabels(group_labels)

je travaille toujours sur la raison pour laquelle votre exemple ci-dessus n'a pas fonctionné.

10
répondu stanri 2012-06-28 13:06:19

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

1
répondu Soham 2017-07-04 03:50:44

Cela fait longtemps que cette question n'a pas été posée. À partir d'aujourd'hui ( matplotlib 2.2.2 ) et après quelques lectures et essais, je pense que la meilleure/correcte façon est la suivante:

Matplotlib a un module nommé ticker que "contient des classes pour supporter la localisation de tique complètement configurable et le formatage" . Pour modifier une tique spécifique de la parcelle, les travaux suivants 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

mise en garde! x est la valeur de la tique et pos est sa position relative dans l'ordre dans l'axe. Notez que pos prend des valeurs commençant par 1 , et non pas dans 0 comme d'habitude lors de l'indexation.


dans mon cas, j'essayais de formater le y-axis d'un histogramme avec des valeurs en pourcentage. mticker a une autre classe appelée PercentFormatter qui peut le faire facilement sans la nécessité de définir une fonction séparée comme avant:

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 de données qui correspond à 100%. Les pourcentages sont calculés comme x / xmax * 100 , c'est pourquoi nous fixons xmax=1.0 . Aussi, decimals est le nombre de décimales à placer après le point.

1
répondu iipr 2018-07-11 17:39:45

vous pouvez le faire:

for k in ax.get_xmajorticklabels():
    if some-condition:
        k.set_color(any_colour_you_like)

draw()
-4
répondu Hachi Manzur 2013-04-12 14:27:05