HOWTO · Matplotlib

Matplotlib-Tick-Label in wissenschaftlicher Notation

In diesem Beitrag erfahren Sie, wie Sie Matplotlib ticklabel_format() verwenden, um Ticks-Label in wissenschaftlicher Notation anzuzeigen.

Auf dieser Seite

Um Tick-Beschriftungen in Matplotlib in wissenschaftlicher Notation anzuzeigen, rufen Sie ticklabel_format(style="sci", scilimits=(0, 0)) für die Achsen auf, die Sie formatieren möchten. Das folgende Beispiel wendet die Einstellung auf die y-Achse eines beschrifteten Diagramms an; mit axis="both" formatieren Sie beide Achsen.

Tick-Beschriftungen mit ticklabel_format() formatieren

Führen Sie dieses Beispiel aus:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

import logging

# The first font-cache build is a normal startup notice, not an execution error.
logging.getLogger("matplotlib.font_manager").setLevel(logging.ERROR)

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots()
x = np.linspace(0, 1_000_000, 100)
y = 22_000 * (x / 1_000_000) ** 10
ax.plot(x, y)
ax.set_xlabel("X values")
ax.set_ylabel("Y values")
ax.set_title("Scientific Notation in Matplotlib")
ax.ticklabel_format(axis="y", style="sci", scilimits=(0, 0))
fig.tight_layout()
plt.show()
print("Scientific notation enabled on the y-axis.")
Scientific notation enabled on the y-axis.

Ein beschriftetes Matplotlib-Liniendiagramm mit Tick-Beschriftungen in wissenschaftlicher Notation auf der y-Achse

plt.show() öffnet das beschriftete Diagramm in einer interaktiven Matplotlib-Umgebung. Die Abbildung oben zeigt denselben Titel, dieselben Beschriftungen und Achsenbereiche sowie dieselbe rasch ansteigende Kurve; der Code und die ausgegebene Statusmeldung bleiben auswählbar.

ticklabel_format() ist eine praktische pyplot-Methode, um den von einer Achse bereits verwendeten Skalarformatierer zu konfigurieren. Für wissenschaftliche Notation steht style auf "sci", für gewöhnliche Dezimalbeschriftungen auf "plain". Zulässige Werte für die Achse sind "x", "y" und "both"; das Argument heißt im Singular axis. Bei einem objektorientierten Diagramm rufen Sie ax.ticklabel_format(...) für das betreffende Axes-Objekt auf.

Achse und Umschaltpunkt für wissenschaftliche Notation auswählen

Verwenden Sie axis="x" oder axis="y", wenn nur eine Tick-Reihe anders dargestellt werden soll, und axis="both", wenn dies für beide gelten soll. Mit der Standardeinstellung scilimits entscheidet Matplotlib, wann auf wissenschaftliche Notation umgeschaltet wird. Die Ganzzahlen im Tupel sind Exponentenschwellen für den Achsenbereich, keine Grenzen für numerische Werte: Sie geben an, wann der Skalarformatierer zwischen gewöhnlichen und wissenschaftlichen Beschriftungen wechselt. scilimits=(0, 0) ist der Sonderfall, der wissenschaftliche Notation für Skalar-Ticks erzwingt. Das ist nützlich, wenn ein Diagramm durchgehend dieses Format verwenden soll. Geändert wird nur die Beschriftungsformatierung, nicht die zugrunde liegenden Daten oder Tick-Positionen.

Das Beispiel formatiert ausdrücklich nur die y-Achse, um die Auswahl einer einzelnen Achse zu zeigen; für die großen x-Werte kann Matplotlib unabhängig davon wissenschaftliche Notation wählen. Wenn Sie beide Achsen formatieren, gilt die angeforderte Formatierung für beide Tick-Reihen. Wählen Sie die Achse passend zu den Werten und zu dem Vergleich, den Leserinnen und Leser anstellen sollen.

Wissenschaftliche Notation mit ScalarFormatter anpassen

Verwenden Sie ScalarFormatter, wenn Sie den Formatierer direkt konfigurieren möchten, etwa für Exponenten in Math-Text-Darstellung oder für Potenzgrenzen. Erstellen Sie ihn mit ScalarFormatter(useMathText=True) und weisen Sie ihn anschließend mit ax.yaxis.set_major_formatter(formatter) zu. Für beide Achsen konfigurieren Sie jede separat. Den Bereich legen Sie mit formatter.set_powerlimits((m, n)) fest; formatter.set_scientific(True) aktiviert wissenschaftliche Notation ausdrücklich. Dies ist der standardmäßige Skalarformatierer, den ticklabel_format() verwendet. Er eignet sich daher für herkömmliche numerische Ticks, wenn Sie mehr Kontrolle über die Exponentendarstellung benötigen.

Tick-Beschriftungen mit FuncFormatter individuell festlegen

Verwenden Sie FuncFormatter, wenn die Beschriftungsregel selbst angepasst werden muss, etwa um Einheiten hinzuzufügen oder eine feste Zahl signifikanter Stellen zu wählen. Der Callback erhält den Tick-Wert und dessen Position, üblicherweise in der Form def format_tick(value, position): ..., und gibt die Beschriftung als Zeichenkette zurück. Zum Beispiel formatiert FuncFormatter(lambda value, position: f"{value:.2e}") jeden Wert in wissenschaftlicher Notation. Weisen Sie den Formatierer der y-Achse mit ax.yaxis.set_major_formatter(...) zu. Das Positionsargument kann ignoriert werden, wenn die Beschriftung nur vom Wert abhängt. Anders als ScalarFormatter legt dieser Callback den vollständigen Beschriftungstext fest; einen gemeinsamen Exponenten oder die Math-Text-Darstellung stimmt er daher nicht automatisch ab.

Verhalten des Formatierers untersuchen

Wenn ticklabel_format() einen AttributeError auslöst, prüfen Sie den Formatierer der Achse: Die Methode konfiguriert einen ScalarFormatter und funktioniert nicht mit jeder Formatiererklasse. Das kann auftreten, nachdem Sie einen FuncFormatter oder einen Datums- beziehungsweise Log-Formatierer zugewiesen haben. Rufen Sie ticklabel_format() auf, bevor Sie den Formatierer ersetzen, oder verwenden Sie direkt ScalarFormatter, wenn Sie die Skalarformatierung wiederherstellen möchten. Gehen Sie nicht davon aus, dass alle Formatiererklassen dieselben Optionen unterstützen.

Bei einer logarithmischen Achse bestimmen die Skalierung und ihr Formatierer die Tick-Positionen und Beschriftungen. Eine Konfiguration des Skalarformatierers, die auf einer linearen Achse funktioniert, ist kein allgemeingültiges Rezept für logarithmische Achsen. Verwenden Sie einen zur Skalierung passenden Formatierer, sofern Sie keinen bestimmten Grund für einen Austausch haben, und prüfen Sie die resultierenden Ticks. Wenn ein unerwarteter Exponent erscheint, überprüfen Sie die ausgewählte Achse, ihre Skalierung und den aktuell zugewiesenen Formatierer, bevor Sie scilimits anpassen.