5 votes

Définir la notation scientifique avec un exposant fixe et des chiffres significatifs pour plusieurs sous-graphiques

Je suis en train d'essayer de fixer les axes à la notation scientifique de deux ensembles de données différents où l'un est [1-9]x1e-3 et l'autre est [1-9]x1e-4. Je voudrais définir les deux axes sur 10^-4 et avoir un chiffre après la virgule (par ex. %.1e). Voici une version simplifiée avec laquelle j'ai essayé de jouer : Je voudrais que les nombres sur les axes soient au moins 1 et je veux que les deux puissances soient les mêmes.

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(1,9,9)
y1 = x*10**(-4)
y2 = x*10**(-3)

fig, ax = plt.subplots(2,1,sharex=True)

ax[0].plot(x,y1)
ax[0].ticklabel_format(axis='y', style='sci', scilimits=(-4,-4))
ax[0].yaxis.major.formatter._useMathText = True
ax[1].plot(x,y2)
ax[1].ticklabel_format(axis='y', style='sci', scilimits=(-4,-4))
ax[1].yaxis.major.formatter._useMathText = True

plt.show()

enter image description here

6voto

ImportanceOfBeingErnest Points 119438

Vous pouvez sous-classer matplotlib.ticker.ScalarFormatter et fixer l'attribut orderOfMagnitude au nombre que vous souhaitez (dans ce cas -4).
De la même manière, vous pouvez fixer le format à utiliser.

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

class OOMFormatter(matplotlib.ticker.ScalarFormatter):
    def __init__(self, order=0, fformat="%1.1f", offset=True, mathText=True):
        self.oom = order
        self.fformat = fformat
        matplotlib.ticker.ScalarFormatter.__init__(self, useOffset=offset, useMathText=mathText)
    def _set_orderOfMagnitude(self, nothing):
        self.orderOfMagnitude = self.oom
    def _set_format(self, vmin, vmax):
        self.format = self.fformat
        if self._useMathText:
            self.format = '$%s$' % matplotlib.ticker._mathdefault(self.format)

x = np.linspace(1,9,9)
y1 = x*10**(-4)
y2 = x*10**(-3)

fig, ax = plt.subplots(2,1,sharex=True)

ax[0].plot(x,y1)
ax[1].plot(x,y2)

for axe in ax:
    axe.yaxis.set_major_formatter(OOMFormatter(-4, "%1.1f"))
    axe.ticklabel_format(axis='y', style='sci', scilimits=(-4,-4))

plt.show()

Alors que cela peut sembler compliqué au premier abord, la seule chose qu'il fait vraiment est de remplacer les méthodes privées _set_orderOfMagnitude et _set_format et ainsi les empêcher d'effectuer des opérations sophistiquées en arrière-plan que nous ne voulons pas. Parce qu'en fin de compte, tout ce que nous voulons, c'est que, indépendamment de ce qui se passe en interne, self.orderOfMagnitude soit toujours -4 et self.format soit toujours "1.1f".

entrez ici la description de l'image

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