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".
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()
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.
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:
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
.
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
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é.
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)
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()
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()
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.
vous pouvez le faire:
for k in ax.get_xmajorticklabels():
if some-condition:
k.set_color(any_colour_you_like)
draw()