Imposta la notazione scientifica con esponente fisso e cifre significative per più sottotrame

Sto cercando di fissare gli assi alla notazione scientifica di due diversi set di dati in cui uno è [1-9] x1e-3 e l’altro è [1-9] x1e-4. Vorrei impostare entrambi gli assi su 10 ^ -4 e avere le cifre una dopo le cifre decimali (es.% .1e). Ecco una versione semplice con cui ho provato a giocare: vorrei che i numeri sugli assi fossero almeno 1 e voglio che entrambe le potenze siano le stesse.

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() 

inserisci la descrizione dell'immagine qui

Puoi sottoclassi matplotlib.ticker.ScalarFormatter e correggi l’attributo orderOfMagnitude al numero che ti piace (in questo caso -4 ).
Allo stesso modo puoi correggere il formato da utilizzare.

 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() 

Anche se questo può sembrare complicato a prima vista, l’unica cosa che fa è sovrascrivere i metodi privati _set_orderOfMagnitude e _set_format e quindi impedire loro di fare alcune cose sofisticate in background che non vogliamo. Perché alla fine tutto ciò di cui abbiamo bisogno è che, indipendentemente da ciò che accade internamente, self.orderOfMagnitude è sempre -4 e self.format è sempre "%1.1f" .

inserisci la descrizione dell'immagine qui