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

2voto

Niranjana K M Points 21

Ici, nous avons l'intention de modifier certaines étiquettes de coche dans la rubrique Matplotlib mais sans effets secondaires, qui fonctionne proprement et qui préserve les notations scientifiques décalées. Cette solution ne pose aucun des problèmes évoqués dans d'autres réponses.

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

from matplotlib import rcParams
rcParams['axes.formatter.use_mathtext'] = True

class CustomScalarFormatter(matplotlib.ticker.ScalarFormatter):
    def __init__(self, useOffset=None, useMathText=None, useLocale=None, replace_values=([],[])):
        super().__init__(useOffset=None, useMathText=None, useLocale=None)
        self.replace_values = replace_values

    def __call__(self, x, pos=None):
        """
        Return the format for tick value *x* at position *pos*.
        """
        if len(self.locs) == 0:
            return ''
        elif x in self.replace_values[0]:
            idx = self.replace_values[0].index(x)
            return str(self.replace_values[1][idx])
        else:
            xp = (x - self.offset) / (10. ** self.orderOfMagnitude)
            if abs(xp) < 1e-8:
                xp = 0
            return self._format_maybe_minus_and_locale(self.format, xp)

z = np.linspace(0, 5000, 100)
fig, ax = plt.subplots()

xmajorformatter = CustomScalarFormatter(replace_values=([2000,0],['$x_0$','']))
ymajorformatter = CustomScalarFormatter(replace_values=([1E7,0],['$y_0$','']))
ax.xaxis.set_major_formatter(xmajorformatter)
ax.yaxis.set_major_formatter(ymajorformatter)

ax.plot(z,z**2)
plt.show()

Nous avons créé une classe dérivée de matplotlib.ticker.ScalarFormatter que matplotlib utilise par défaut pour formater les étiquettes. Le code est copié à partir des sources de matplotlib mais seulement __call__ y est copiée et modifiée. A la suite de

        elif x in self.replace_values[0]:
            idx = self.replace_values[0].index(x)
            return str(self.replace_values[1][idx])

sont les nouvelles lignes ajoutées au __call__ qui effectuent le travail de remplacement. L'avantage d'une classe dérivée est qu'elle hérite de toutes les caractéristiques de la classe de base, comme la notation offset, les étiquettes de notation scientifique si les valeurs sont grandes. Le résultat est le suivant :

Output of above code

-4voto

Hachi Manzur Points 1

Vous pouvez faire :

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

draw()

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