2017-03-07 1 views
3

J'essaie 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 à 10^-4 et avoir les chiffres un après décimal (par exemple% .1e). Voici une version simple 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 pouvoirs soient identiques.Définir la notation scientifique avec l'exposant fixe et les chiffres significatifs pour plusieurs sous-plans

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

Répondre

3

Vous pouvez sous-classe matplotlib.ticker.ScalarFormatter et fixer l'attribut orderOfMagnitude au numéro que vous voulez (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() 

Même si cela peut paraître compliqué à première vue, la seule chose qu'il fait vraiment est écrasera les méthodes privées _set_orderOfMagnitude et _set_format et ainsi les empêcher de faire des trucs sophistiqués dans le contexte que nous ne voulons pas. Parce qu'à la fin, tout ce dont nous avons besoin est que, indépendamment de ce qui se passe en interne, self.orderOfMagnitude est toujours -4 et self.format est toujours "%1.1f".

enter image description here

+0

Cela fonctionne! Je me demandais juste si vous pouviez expliquer ce que chaque définition de la classe faisait et doit-elle être étendue pour fixer le nombre de sig figs, par exemple si je veux un après la virgule (par exemple 1.835 e-3 -> 18.3 e-4) @ImportanceOfBeingErnest – Gregory

+0

J'ai édité la réponse pour inclure également le format. – ImportanceOfBeingErnest

+0

Merci! J'ai accepté la réponse – Gregory