Ändern Sie die x-Achsen-Skala in matplotlib

92

Ich habe diesen Plot mit Matlab erstellt

Geben Sie hier die Bildbeschreibung ein

Mit matplotlib zeichnen die x-Achsen große Zahlen wie 100000, 200000, 300000. Ich hätte gerne 1, 2, 3 und 10 ^ 5, um anzuzeigen, dass es tatsächlich 100000, 200000, 300000 ist.

Gibt es eine einfache Möglichkeit, eine solche Skala in matplotlib zu erstellen?

Adler
quelle

Antworten:

144

Versuchen Sie es mit matplotlib.pyplot.ticklabel_format:

import matplotlib.pyplot as plt
...
plt.ticklabel_format(style='sci', axis='x', scilimits=(0,0))

Dies wendet die wissenschaftliche Notation (dh a x 10^b) auf Ihre x-Achsen-Häkchen an

Chris
quelle
9
Ist es möglich, einen Offset hinzuzufügen? (zB anstelle von 0.0, 0.5, 1.0, 1.5, ... und x 10 ^ b ist es 0, 5, 10, 15, ... und x 10 ^ {b-1})
Eagle
24
ticklabel_formatist auch eine Methode für die ax.ticklabel_format(style='sci', axis='x', scilimits=(0,0))
Achsenobjekte
Wie kann dies funktionieren, wenn Sie eine Nebenhandlung von beispielsweise 2 Grundstücken haben?
FaCoffee
2
@Eagle Entschuldigung, Ihre Folgefrage zum Hinzufügen eines Offsets war das, worauf ich mich bezog. Meine x-Achse ist [0.1, 0.2, ...]und ich würde es vorziehen, [1, 2, ...]einen angepassten Exponenten zu verwenden. Konnten Sie eine Lösung dafür finden?
Trianta2
@Eagle Ich interessiere mich auch für die Frage trianta2 erwähnt
Ben Usman
16

Dies ist weniger eine Antwort auf Ihre ursprüngliche Frage als vielmehr auf eine der Fragen, die Sie im Hauptteil Ihrer Frage hatten.

Eine kleine Präambel, damit meine Benennung nicht seltsam erscheint:

import matplotlib
from matplotlib import rc
from matplotlib.figure import Figure
ax = self.figure.add_subplot( 111 )

Wie bereits erwähnt, können Sie mit ticklabel_format angeben, dass matplotlib die wissenschaftliche Notation für große oder kleine Werte verwenden soll:

ax.ticklabel_format(style='sci',scilimits=(-3,4),axis='both')

Sie können die Art und Weise beeinflussen, wie dies angezeigt wird, indem Sie die Flags in rcParams (aus dem matplotlib-Import von rcParams) oder direkt festlegen. Ich habe keinen eleganteren Weg gefunden, zwischen der wissenschaftlichen Notation '1e' und 'x10 ^' zu wechseln als:

ax.xaxis.major.formatter._useMathText = True

Dies sollte Ihnen mehr Matlab-esc und in der Tat wohl besseres Aussehen geben. Ich denke, Folgendes sollte dasselbe tun:

rc('text', usetex=True)
Weir_Doe
quelle
11

Der Skalarformatierer unterstützt das Sammeln der Exponenten. Die Dokumente lauten wie folgt:

Klasse matplotlib.ticker.ScalarFormatter (useOffset = True, useMathText = False, useLocale = None) Grundlagen: matplotlib.ticker.Formatter

Der Tick-Standort ist eine einfache alte Nummer. Wenn useOffset == True ist und der Datenbereich viel kleiner als der Datenmittelwert ist, wird ein Versatz ermittelt, sodass die Häkchenbezeichnungen aussagekräftig sind. Die wissenschaftliche Notation wird für Daten <10 ^ -n oder Daten> = 10 ^ m verwendet, wobei n und m die Leistungsgrenzen sind, die mit set_powerlimits ((n, m)) festgelegt wurden. Die Standardeinstellungen für diese werden durch den Parameter axes.formatter.limits rc gesteuert.

Ihre Technik wäre:

from matplotlib.ticker import ScalarFormatter
xfmt = ScalarFormatter()
xfmt.set_powerlimits((-3,3))  # Or whatever your limits are . . .
{{ Make your plot }}
gca().xaxis.set_major_formatter(xfmt)

x10^5Instanziieren Sie den ScalarFormatter mit, um den Exponenten im Format anzuzeigen useMathText=True.

Nach dem Bild

Sie könnten auch verwenden:

xfmt.set_useOffset(10000)

So erhalten Sie ein Ergebnis:

Geben Sie hier die Bildbeschreibung ein

Carl F.
quelle
3
Instanziieren Sie den ScalarFormatter mit useMathText=True, um zu erhalten x10^4.
Bis Hoffmann
9

Ich finde die einfache Lösung

pylab.ticklabel_format(axis='y',style='sci',scilimits=(1,4))
Cunzhang
quelle