2017-04-10 3 views
9

Ich versuche, eine Farbleiste auf meiner Matpllotlib Konturf Plots anzupassen. Während ich wissenschaftliche Notation verwenden kann, versuche ich, die Basis der Notation zu ändern - im Wesentlichen so, dass meine Ticks im Bereich von (-100,100) statt (-10,10) liegen.Python matplotlib colorbar wissenschaftliche Notation Basis

Zum Beispiel ergibt sich eine einfache Handlung ...

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

wie so:

enter image description here

Allerdings habe ich das Etikett über dem colorbar sein möchte 1e-2 und die Zahlen reichen von -10 bis 10.

Wie würde ich darüber gehen?

Antwort

2

Eine mögliche Lösung kann die ScalarFormatter und fixieren die Größenordnung Unterklasse, wie in dieser Frage: Set scientific notation with fixed exponent and significant digits for multiple subplots

Sie würden dann mit der Größenordnung als Argument OOMFormatter(-2, mathText=False)order, diese Formatierer aufrufen. mathText wird auf false gesetzt, um die Notation aus der Frage zu erhalten, d. H. enter image description here während es auf True gesetzt wird, würde enter image description here ergeben.

Sie können den Formatierer dann über das Argument format der Farbleiste auf die Farbleiste setzen.

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

Ähnlich wie @ImportanceOfBeingErnes beschrieben, könnten Sie ein FuncFormatter (docs) verwenden, um die Sie nur eine Funktion übergeben, die Zecke Etiketten zu bestimmen. Dies entfernt die automatische Generierung des Headers 1e-2 für Ihre Farbleiste, aber ich kann mir vorstellen, dass Sie das manuell hinzufügen können (ich hatte Schwierigkeiten damit, obwohl ich es auf der Seite hinzufügen konnte). Mit einem FuncFormatter können Sie nur Tick-Werte generieren, was den Vorteil hat, dass Sie nicht akzeptieren müssen, wie python eine Zahl anzeigt.

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

Dies wird ein Diagramm generieren, das so aussieht.

Contour Plot

Verwandte Themen