2017-04-10 1 views
9

J'essaie de personnaliser une barre de couleurs sur mes parcelles matpllotlib contourf. Alors que je suis capable d'utiliser la notation scientifique, j'essaie de changer la base de la notation - essentiellement de sorte que mes tiques seraient dans la gamme de (-100,100) plutôt que (-10,10).Python matplotlib colorbar base notation scientifique

Par exemple, cela produit une intrigue simple ...

import numpy as np 
import matplotlib.pyplot as plt 

z = (np.random.random((10,10)) - 0.5) * 0.2 

fig, ax = plt.subplots() 
plot = ax.contourf(z) 
cbar = fig.colorbar(plot) 

cbar.formatter.set_powerlimits((0, 0)) 
cbar.update_ticks() 

plt.show() 

comme ceci:

enter image description here

Cependant, je voudrais l'étiquette au-dessus du colorbar pour être 1E-2 et les chiffres doivent être compris entre -10 et 10.

Comment procéder?

Répondre

2

Une solution peut être de sous-classe la ScalarFormatter et fixer l'ordre de grandeur que dans cette question: Set scientific notation with fixed exponent and significant digits for multiple subplots

Vous pouvez ensuite appeler cette formatter avec l'ordre de grandeur que l'argument order, OOMFormatter(-2, mathText=False). mathText est mis à false pour obtenir la notation de la question, c'est-à-dire enter image description here tout en le définissant à True, donnerait enter image description here.

Vous pouvez ensuite définir le formateur sur la barre de couleurs via l'argument format de la barre de couleurs.

import numpy as np; np.random.seed(0) 
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) 


z = (np.random.random((10,10)) - 0.5) * 0.2 

fig, ax = plt.subplots() 
plot = ax.contourf(z) 
cbar = fig.colorbar(plot, format=OOMFormatter(-2, mathText=False)) 

plt.show() 

enter image description here

1

similaires à ce que @ImportanceOfBeingErnes décrit, vous pouvez utiliser un FuncFormatter (docs) auquel vous passez juste une fonction pour déterminer les étiquettes de tiques. Cela supprime la génération automatique de l'en-tête 1e-2 pour votre barre de couleurs, mais j'imagine que vous pouvez y ajouter manuellement (j'ai eu du mal à le faire, mais j'ai pu l'ajouter sur le côté). En utilisant un FuncFormatter, vous pouvez simplement générer des valeurs de ticks de chaîne qui ont l'avantage de ne pas avoir à accepter la façon dont python pense qu'un nombre devrait être affiché.

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

z = (np.random.random((10,10)) - 0.5) * 0.2 

levels = list(np.linspace(-.1,.1,9)) 

fig, ax = plt.subplots() 
plot = ax.contourf(z, levels=levels) 

def my_func(x, pos): 
    label = levels[pos] 
    return str(label*100) 

fmt1 = tk.FuncFormatter(my_func) 

cbar = fig.colorbar(plot, format=fmt1) 
cbar.set_label("1e-2") 

plt.show() 

Cela générera un tracé qui ressemble à ceci.

Contour Plot