Je souhaite apporter quelques modifications à quelques étiquettes de tick sélectionnées dans un tracé.
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 à cocher sont modifiées.
Cependant, si essayez:
label.set_text('Foo')
l'étiquette de coche n'est pas modifiée. Aussi si je le fais:
print label.get_text()
rien n'est imprimé.
Voici un peu plus d'é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 le tracé contient des graduations intitulées «0,0», «0,5», «1,0», «1,5» et «2,0».
python
matplotlib
repoman
la source
la source
draw()
avant d'essayer d'imprimer les étiquettes, vous obtiendrez ce que vous attendez. Définir des étiquettes de tick individuelles est malheureusement un peu plus difficile (ce qui se passe, c'est que le localisateur de ticks et le formateur n'ont pas été réinitialisés et qu'il remplace les choses quand vousset_text
) J'ajouterai un exemple dans un instant, si quelqu'un ne me bat pas. Mais je dois prendre le bus pour le moment.Réponses:
Mise en garde: à moins que les ticklabels soient déjà définis sur une chaîne (comme c'est généralement le cas par exemple dans un boxplot), 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, cela ne fonctionnera pas. Je ne sais pas encore quel est le problème ... Ce peut être un changement involontaire, ou ce peut ne pas être ...Normalement, vous feriez quelque chose dans ce sens:
Pour comprendre la raison pour laquelle vous devez sauter à travers tant de cerceaux, vous devez comprendre un peu plus la structure de matplotlib.
Matplotlib évite délibérément de faire un positionnement "statique" des tiques, etc., à moins que cela ne soit explicitement demandé. L'hypothèse est que vous voudrez interagir avec l'intrigue, et donc les limites de l'intrigue, les ticks, les ticklabels, etc. changeront dynamiquement.
Par conséquent, vous ne pouvez pas simplement définir le texte d'une étiquette de tick donnée. Par défaut, il est réinitialisé par le localisateur et le formateur de l'axe chaque fois que le tracé est tracé.
Cependant, si les localisateurs et les formateurs sont définis pour être statiques (
FixedLocator
etFixedFormatter
, respectivement), les étiquettes de graduation restent les mêmes.C'est ce
set_*ticklabels
ouax.*axis.set_ticklabels
fait.J'espère que cela explique un peu plus clairement pourquoi changer une étiquette de tique individuelle est un peu compliqué.
Souvent, ce que vous voulez réellement faire, c'est simplement annoter une certaine position. Dans ce cas, regardez
annotate
plutôt.la source
bold
alors que d'autres utilisent le poids de police de "light". Y a-t-il un moyen de le faire?fig.canvas.draw()
c'est crucialOn peut aussi le faire avec pylab et xticks
http://matplotlib.org/examples/ticks_and_spines/ticklabels_demo_rotation.html
la source
Dans les versions plus récentes de
matplotlib
, si vous ne définissez pas les étiquettes de tick avec un tas destr
valeurs, elles le sont''
par défaut (et lorsque le tracé est tracé, les étiquettes sont simplement les valeurs de ticks). Sachant cela, pour obtenir la sortie souhaitée, il faudrait quelque chose comme ceci:et le résultat:
et maintenant si vous cochez la
_xticklabels
, ils ne sont plus un tas de''
.Il fonctionne dans les versions de
1.1.1rc1
à la version actuelle2.0
.la source
set_xticklabels
une liste mixte de chaînes et d'objets tick.ax.get_xticks().tolist()
). La solution la plus votée ne l'a pas été (ax.get_xtickslabels()
). D'une manière ou d'une autre, il n'a pas été en mesure d'extraire les étiquettes avant l'plt.show()
excusion, bien que j'aie utiliséfig.canvas.draw()
comme suggéré.Cela fait un moment que cette question n'a pas été posée. À ce jour (
matplotlib 2.2.2
) et après quelques lectures et essais, je pense que la meilleure / bonne façon est la suivante:Matplotlib a un module nommé
ticker
qui "contient des classes pour prendre en charge la localisation et le formatage des ticks entièrement configurables" . Pour modifier une coche spécifique de l'intrigue, la procédure suivante fonctionne pour moi:Caveat!
x
est la valeur de la tique etpos
sa position relative dans l'ordre dans l'axe. Notez quepos
prend des valeurs commençant par1
, pas0
comme d'habitude lors de l'indexation.Dans mon cas, j'essayais de formater l'
y-axis
histogramme avec des valeurs de pourcentage.mticker
a une autre classe nomméePercentFormatter
qui peut le faire facilement sans avoir besoin de définir une fonction distincte comme précédemment:Dans ce cas,
xmax
c'est la valeur des données qui correspond à 100%. Les pourcentages sont calculés commex / xmax * 100
, c'est pourquoi nous corrigeonsxmax=1.0
. Est égalementdecimals
le nombre de décimales à placer après le point.la source
La classe axes a une fonction set_yticklabels qui vous permet de définir les étiquettes de tick, comme ceci:
Je travaille toujours sur la raison pour laquelle votre exemple ci-dessus n'a pas fonctionné.
la source
Cela marche:
la source
Cela fonctionne également dans matplotlib 3:
la source
Si vous ne travaillez pas avec
fig
etax
que vous souhaitez modifier toutes les étiquettes (par exemple pour la normalisation), vous pouvez le faire:la source
Essaye ça :
la source
tu peux faire:
la source