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 :