© Der/die Autor(en), exklusiv lizenziert an Springer Fachmedien Wiesbaden GmbH, ein Teil von Springer Nature 2022
L. ClassenMit Jupyter durchs Physikpraktikumessentialshttps://doi.org/10.1007/978-3-658-37723-6_4

4. Diagramme mit  matplotlib.pyplot

Lew Classen1  
(1)
Institut für Kernphysik, WWU Münster, Münster, Deutschland
 
 
Lew Classen

Es heißt, ein Bild sagt mehr als Tausend Worte und so kommt kaum ein Versuchsbericht (und auch keine Abschlussarbeit oder andere wissenschaftliche Veröffentlichung) ohne Diagramme aus. Die Aufgabe von Diagrammen (bzw. Plots) ist es, Messreihen, Funktionen oder sonstige Zusammenhänge zu visualisieren. Die Anforderungen an ein Diagramm richten sich, unter anderem, nach der Art der Daten, der geplanten Verwendung und der Zielgruppe. Entsprechend der geplanten Verwendung eines Diagramms ergeben sich beispielsweise verschiedene Design-Schwerpunkte. So sollte ein Diagramm, dass vor allem der Analyse von Daten und der Suche nach Besonderheiten dient, schnell gemacht, leicht veränderbar und im Idealfall interaktiv sein, während der Feinschliff weniger wichtig ist. Geht es dagegen darum Ihre Ergebnisse – z. B. im Versuchsbericht – zu präsentieren, ist es wichtig den Plot so aufzubereiten, dass er vollständig1, aber gleichzeitig übersichtlich und für die Zielgruppe verständlich ist. Das gesamte Layout sollte darauf ausgerichtet sein, Ihre Aussage zu unterstützen.

Die Gestaltung eines Diagramms richtet sich auch nach der Art der dargestellten Daten. Bei der wiederholten Messung der selben Größe bieten sich Histogramme an um die statistische Verteilung sichtbar zu machen. Bestehen die Datenpunkte einer Messung aus mehreren (meist zwei) zusammenhängenden Größen, verwendet man üblicherweise Punktdiagramme mit einer entsprechenden Anzahl von Achsen (meist zwei). Dabei wird die unabhängige Variable2 gewöhnlich auf der x-Achse und die abhängige Variable auf der y-Achse aufgetragen. Die Verwendung von Punktmarkern zeigt ihrem Publikum klar, welche Werte tatsächlich gemessen wurden, während eine Verbindungslinie hier zusätzliche Information suggerieren würde. Daher ist die Darstellung mit Linien meist Funktionskurven vorbehalten. Sind die Unsicherheiten der Messgrößen bekannt, können diese mit „Fehlerbalken“ dargestellt werden.

Was macht also ein gutes Diagramm aus? Eine – nicht abschließende – Liste ist:
  • angemessene Darstellung mit Punkten, Linien, Balken, ...

  • sinnvolle Wahl des dargestellten Bereichs

  • sinnvolle Wahl der Achseneinteilung (lineare Skala, logarithmische Skala)

  • gut lesbare Achsenbeschriftung (besser zu groß als zu klein)

  • Angabe von Einheiten

  • verständliche und lesbare Legende (v. a. bei mehreren Messreihen)

  • möglichst kein Verdecken von Datenpunkten

  • ...

Eine sehr guten Ratgeber zur Gestaltung von fachlich hochwertigen und optisch ansprechenden Diagrammen finden Sie in Claus O. Wilke: Fundamentals of Data Visualization, O’Reilly (2019), https://​clauswilke.​com/​dataviz/​index.​html.

In diesem Kapitel werden Sie die Umsetzung dieser Ideen in Jupyter-Notebooks mit Python kennen lernen. Im einzelnen wird es darum gehen
  • wie Sie Messreihen und Funktionen graphisch darstellen.

  • wie Sie statische und interaktive Plots erstellen.

  • wie Sie das Aussehen eines Plots Ihren Wünschen anpassen.

  • wie Sie Ihren Plot in einer Datei abspeichern.

  • wie Sie komplizierte Plots erstellen.

4.1 Einfache Plots

Nun werfen wir einen ersten Blick auf das Plotten von Messreihen und Funktionen. Dafür werden wir das Python-Modul matplotlib.pyplot verwenden3. Der Standardimport des Moduls lautet:
Minimalbeispiel
Visualisieren wir zunächst die Messreihe aus Abschn. 3.​1. Die „Mindestzutaten“, die Sie für einen Plot benötigen, sind
  • ein Array mit x-Werten,

  • ein Array mit y-Werten, und

  • die Funktion plt.plot()

Da es üblich ist Messreihen mit Punkten, Kreisen, Kreuzen oder anderen Markern zu plotten während Funktionsverläufe mit Linien dargestellt werden lautet der Befehl in unserem Fall

wobei in diesem Funktionsaufruf der Parameter "o" die Darstellung der Datenpunkte mit Kreisen erzeugt. Standardmäßig werden die Datenpunkte beim Aufruf von plt.plot() mit Linien verbunden.4.

Abb. 4.1

Ein einfacher Plot einer Messreihe mit Punktmarkern

Abb. 4.2

Interaktiver Plot mit Bedienelementen. Die Zelle mit dem magic Befehl matplotlib notebook muss nur einmal ausgeführt werden, um in den interaktiven Modus zu wechseln

Statische und interaktive Plots
Normalerweise erscheint durch den obigen Befehl ein statischer Plot im Outputbereich direkt unterhalb der Code-Zelle, wie er ein Abb. 4.1 dargestellt ist. Dieser kann nur durch das Einfügen weiterer Befehle innerhalb der Code-Zelle und ihr erneutes Ausführen geändert werden. Es gibt aber auch die Möglichkeit den Plot interaktiv zu machen. Dazu müssen Sie nur, am besten in einer gesonderten Code-Zelle, einen magic Befehl5 ausführen:
Im Outputbereich erscheint nun ein leicht vergrößerter Plot mit einer Werkzeugleiste, über die man den Plot direkt mit der Maus bearbeiten kann (siehe Abb. 4.2). Interaktive Plots erlauben es Ihnen den Graphen im Fenster zu verschieben oder einen Bildausschnitt zu vergrößern und so Ihre Messreihe, im wahrsten Sinne des Wortes, genauer unter die Lupe nehmen. Es besteht auch die Möglichkeit per Mausklick einen Schnappschuss des aktuellen Plots in einer png-Datei abzuspeichern. Haben Sie die Betrachtung der Daten abgeschlossen, sollte das Plotfenster mit dem blauen Button deaktiviert werden. Tun Sie das nicht, erscheint jeder weitere Graph, den Sie später im Notebook erzeugen, automatisch im aktiven Plotfenster und Sie erhalten unübersichtlichen „Plotsalat“. Alternativ können Sie Ihrem Plotbefehl die Zeile plt.figure() voranstellen. Damit wir explizit ein neues Plotfenster angelegt und das Ausschalten ist nicht mehr dringend erforderlich. Einmal aktiviert, gilt der interaktive Modus im gesamten Notebook für alle Plotbefehle, die danach ausgeführt werden. Um zum statischen Plotten zurückzukehren, führen Sie den Befehl

aus6.

Histogramme
Histogramme benötigen als minimalen Input nur ein Array mit der Datenreihe, die man histogrammieren möchte:
Über Argumente dieser Funktion lässt sich das Histogramm weiter modifizieren. In der Voreinstellung werden zehn Bins verwendet. Mit dem Parameter bins kann man diesen Wert manuell einstellen:

Es macht Sinn, mit verschiedenen Binanzahlen zu experimentieren. Bei zu vielen Bins werden die Einträge stark fluktieren, bzw. einzelne Bins ganz leer sein. Bei zu wenigen Bins verlieren sich Details der Verteilung. Ein Histogramm der Magnetfelddaten aus Abschn. 3.​1 finden Sie in Abb. 4.3.

Fehlerbalken
Die graphische Darstellung des Unsicherheitsintervalls von Datenpunkten erfolgt durch sogenannte Fehlerbalken (error bars). Die entsprechende Funktion in matplotlib.pyplot heißt plt.errorbar(). Neben Arrays für die x- und y-Werte (x_values, y_values) werden hier zusätzlich Arrays für die Unsicherheiten in beiden Dimansionen benötigt (xerr, yerr):
Sind die Unsicherheiten aller Punkte in einer Dimension gleich, reicht es aus einen einzigen Wert statt eines Arrays zu übergeben. Mit den bekannten Messunsicherheiten des Temperatur- und des Drucksensors aus dem header von temperatur_druck.txt
Abb. 4.3

Histogramm der Magnetfelddaten (Array B_tot) aus Abschn. 3.​1. Hier werden die voreingestellten zehn Bins verwendet. Das Semikolon am Zeilenende ist optional und unterdrückt die Ausgabe von zusätzlichem Text

können wir also den p(T)-Graphen folgendermaßen erweitern:
Den Parameter linestyle werden wir im nächsten Abschnitt genauer kennen lernen. Hier verhindert er, dass die Messpunkte zusätzlich mit Linien verbunden werden. Das Ergebnis ist in Abb. 4.4 dargestellt.
Abb. 4.4

Diagramm mit Fehlerbalken

Darstellung von Funktionen

Die Darstellung von Funktionen unterscheidet sich nicht prinzipiell von der von Messreihen. Auch hier brauchen Sie Arrays mit x- und y-Werten. Nachdem Sie sich für den Bereich entschieden haben, in dem Sie eine Funktion darstellen möchten, teilen Sie diesen (am praktischsten mit np.linspace() aus Abschn. 3.​2) in gleichmäßig verteilte Stützstellen, die x-Werte, ein. Hier gilt: Je komplizierter der Funktionsverlauf, desto mehr x-Werte sollte man erzeugen um eine glatte Darstellung der Kurve ohne sichtbare Kanten zu erhalten. Anschließend wenden Sie die Funktion auf das gesamte Array an um die y-Werte zu erzeugen. Nun muss man nur noch beide Arrays an plt.plot() übergeben. In Abb. 4.5 wird dieses Prinzip verwendet den Verlauf einer Parabel zwischen 0 und 2 darzustellen.

Abb. 4.5

Verlauf einer Parabel. Für die Darstellung wurde explizit ein Array mit 50 Werten zwischen 0 und 2 erzeugt (x_werte) und ihr Quadrat berechnet (y_werte)

4.2 Zum publikationsreifen Diagramm

Um sich selbst einen ersten Überblick über eine Messreihe zu verschaffen, reicht ein Plot mit den Standardeinstellungen völlig aus. Nun können wir damit beginnen ihn auf Publikationsniveau zu heben. Hier haben Sie sehr viele Möglichkeiten und da matplotlib das beliebteste Paket zum Plotten in Python ist, gibt es online viele hilfreiche Foreneinträge und Code-Beispiele. Für Ihre Online-Suche nennen Sie am besten den Paketnamen (matplotlib, matplotlib.pyplot oder plt) und formulieren Ihr Ziel auf Englisch. Im folgenden werden wir uns die wichtigsten Optionen genauer ansehen um schnell zu einem ansprechenden Ergebnis zu kommen.

Marker und Linien
Beginnen wir mit dem Aussehen der Datenmarker und Linien. Die wichtigsten Argumente für ihre Anpassung sind:
  • marker: Definiert das Aussehen der Datenpunktmarker.

  • markersize: Legt die Größe der Datenpunktmarker fest.

  • linestyle: Definiert den Strichstil einer Linie.

  • linewidth: Definiert die Linienbreite.

Während markersize und linewidth numerische Werte erwarten, benötigen Sie für die Parameter marker und linestyle spezielle strings. In den Tab. 4.1 und 4.2 finden Sie dazu eine Zusammenstellung der gängigsten Marker und Linienstile.
Tab. 4.1

Übersicht gängiger Punktmarker

Code

Beschreibung

Kein Marker

Punkt

Kreis

Stern

Rechteck

Raute (breit, schmal)

Fünfeck

Verschiedene Achtecke

Verschiedene Kreuze

Dreiecke (Ausrichtung: unten, oben, links, rechts)

Tab. 4.2

Übersicht gängiger Linienstile

Code

Kurz-Code

Beschreibung

Keine Linie

Durchgezogen

Gestrichelt

Gepunktet

Striche und Punkte abwechselnd

Die Argumente werden in beliebiger Reihenfolge an die Funktion plt.plot() oder plt.errorbar() übergeben. Beispiele für die Verwendung der Marker- und der Linienparameter finden Sie in den Abb. 4.6 und 4.7. Weiterführende Informationen zu Datenmarkern und Linien erhalten Sie unter https://​matplotlib.​org/​api/​markers_​api.​html bzw. unter https://​matplotlib.​org/​stable/​gallery/​lines_​bars_​and_​markers/​linestyles.​html.
Abb. 4.6

Plot mit expliziter Angabe des Typs und der Größe der Datenpunktmarkierungen. Der Parameter linestyle="" eliminiert explizit das Verbinden der Datenpunkte mit einer Linie

Abb. 4.7

Plot mit expliziter Angabe des Strichtyps und der Breite der Linie

Farben
Um mehrere Messreihen oder Funktionen in einem Diagramm zu erhalten, platzieren Sie mehrere plt.plot()-Befehle nacheinander in einer Code-Zelle und führen diese aus:
Abb. 4.8

Mehrere Funktionen in einem gemeinsamen Diagramm mit automatischer Farbgebung

Dabei werden die Graphen automatisch mit unterschiedlichen Farben aus der Standardfarbpalette von matplotlib dargestellt (siehe Abb. 4.8). Sie können die Farben Ihrer Graphen aber auch explizit durch Argumente festlegen. Die Parameter, die Sie dafür brauchen sind:
  • color für die Farbe des Graphen und

  • alpha um den Grad der Transparenz festzulegen, wobei alpha eine Fließkommazahl (float) zwischen 0 (Graph erscheint komplett transparent) und 1 (Graph erscheint in deckender Farbe) ist.

Für die Angabe einer Farbe über den color-Parameter hat man wiederum mehrere Optionen. Die gängigsten sind:
  • ein expliziter Farbname (als string), z. B. "blue", "red" oder "pink".

  • eine Farbnummer, die für die Position einer Farbe in der aktuellen Palette steht, z. B. "C0", "C1", "C2" für die erste, zweite und dritte Standardfarbe.

  • ein RGB-Farbcode, also eine Kombination aus Werten, die für den Rot-, Grün- und Blauanteil der gewünschten Farbe stehen. Die Werte können dabei entweder als Tupel aus Dezimalzahlen, wie (0.1, 0.2, 0.5), oder als string aus Hexadezimalzahlen übergeben werden, z. B. "#1f77b4"7.

In der Praxis könnte das Ergebnis dann wie in Abb. 4.9 aussehen. Eine sehr umfangreiche Liste mit möglichen Farbnamen und den dazugehörigen RGB-Codes finden Sie unter https://​xkcd.​com/​color/​rgb/​. Weitere Optionen zum Definieren von Farben werden unter https://​matplotlib.​org/​users/​colors.​html erläutert.
Abb. 4.9

Mehrere Funktionen in einem gemeinsamen Diagramm mit verschiedenen Varianten der manuellen Farbauswahl

Wie Sie sehen, haben Sie zahlreiche Möglichkeiten ein Diagramm Ihren Wünschen anzupassen. Und da matplotlib inzwischen sehr weit verbreitet ist und über eine aktive Nutzergemeinde verfügt, finden Sie online viele hilfreiche Foreneinträge und Code-Beispiele. Gute Suchbegriffe wären beispielsweise matplotlib in Verbindung mit linestyle, marker, color, color name, transparency oder den Namen der optionalen Parameter.

Beschriftungen
Auf dem Weg zu einen publikationsreifen Plot brauchen wir außerdem Achsenbeschriftungen. Aber auch Graphen, Bereiche oder das gesamte Diagramm lassen sich über entsprechende Funktionen mit Beschriftungen versehen. Praktischerweise sind die Namen vieler dieser Funktionen ziemlich intuitiv:
Die gewünschte Beschriftung wird jeweils als string übergeben. Eine Anmerkung an einer beliebigen Stelle mit den Koordinaten (x,y) erhalten Sie mit:
Legende
Haben Sie mehrere Graphen in einem Plot platziert, bietet sich eine erläuternde Legende an. Die Funktion
platziert eine Legende im Plot. Die Beschriftungen der einzelnen Graphen werden der Funktion plt.plot() über das das Argument label="..." übergeben. Automatisch wird die Legende so platziert, dass Linien und Datenpunkte möglichst nicht verdeckt werden. Sie können die Platzierung, über den Parameter loc, auch selbst steuern. Am bequemsten verwenden Sie für die Platzierung string-Ortsangaben aus einer Kombination der Worte "upper", "lower", "center", "left" und "right". Beispielsweise erzeugt der Befehl
eine Legende in der linken unteren Ecke des Diagramms. Mit einem Ergebnis wie in Abb. 4.10 kommen wir einem publikationsreifen Diagramm ein ganzes Stück näher.
Abb. 4.10

Diagramm mit Beschriftungen und Legende. Mit dem Parameter loc="best" wird die Legende explizit so platziert, dass möglichst kein Graph verdeckt wird. Wird plt.legend() ohne Parameter aufgerufen ist das die Voreinstellung

Achsenskalierung und Gitter
Der dargestellte Bereich auf beiden Achsen wird von matplotlib automatisch so gewählt, dass alle Datenpunkte, mit einem Puffer in allen Richtungen, gut zu sehen sind. Entsprechend wird auch die Skaleneinteilung gewählt um ein harmonisches Gesamtbild des Plots zu erzeugen. Sie können aber auch selbst die Kontrolle übernehmen. Im interaktiven Modus (%matplotlib notebook) gibt es dazu Buttons und die Möglichkeit mit der Maus zu Zoomen, die wir bereits in Abschn. 4.1 kennen gelernt haben. Im statischen Modus legen Sie mit den Funktionen

die dargestellten Bereiche explizit fest, wobei die Parameterpaare left, right und bottom, top die untere und obere Grenze des Bereichs definieren. Beide können als Variablen oder auch explizit als Werte an die Funktionen übergeben werden.

Eine logarithmische Skalierung der Achsen erhalten Sie mit den Funktionen:
Außerdem können die Achsen manuell eingeteilt werden indem Sie der entsprechenden Funktion ein Array mit den gewünschten Positionen der Skalenstriche übergeben:

Beide Funktionen benötigen als Argument jeweils ein numpy-Array mit den gewünschten Positionen der Skaleneinteilung. Hierfür bieten sich die numpy-Funktionen np.arange() und np.linspace() an, die wir bereits in Abschn. 3.​2 kennen gelernt haben. Mit der Funktion plt.minorticks_on() können Sie den Raum zwischen zwei Skalenstrichen mit zusätzlichen unbeschrifteten Skalenstrichen feiner unterteilen.

Die Funktion
erzeugt, ausgehend von der Skaleneinteilung, ein Raster aus Gitternetzlinien, die bei der Orientierung im Plot helfen. Der Plot in Abb. 4.11 demonstriert das Zusammenspiel der bisher präsentierten Funktionen.
Abb. 4.11

Diagramm mit manueller Auswahl des dargestellten Bereichs, manueller Einteilung einer Achse und Gitternetzlinien

Diagrammgröße
Wir hatten schon gesehen, dass die Größe des Diagramms sich beim Umschalten zwischen dem statischen und dem interaktiven Modus ändert. Die Größe der Abbildung kann aber auch manuell eingestellt werden. Dazu dient die Funktion8

Die beiden Variablen Breite und Hoehe stehen hier stellvertretend für zwei floats, also Dezimalzahlen. Sie legen die Breite und Höhe des Diagramms in inch fest.

Speichern von Diagrammen
Um den Plot aus Ihrem Jupyter-Notebook in Ihren Versuchsbericht einfügen zu können, müssen Sie ihn zunächst als (Bild-)Datei exportieren. Wie wir bereits weiter oben gesehen haben, lassen sich interaktive Plots per Mausklick als .png-Datei speichern. Darüber hinaus gibt es für das Speichern von statischen und interaktiven Plots die Funktion plt.savefig(). Als Zielformate stehen Ihnen unter anderem .pdf, .jpg und .png zur Verfügung. Die Definition des Formats erfolgt automatisch über die Endung im angegebenen Dateinamen. So erzeugt der Befehl

eine Datei im .pdf-Format welche Ihren Plot enthält. Die Abmessungen des erzeugten Bildes werden aus der Plotgröße entnommen. Manchmal kommt es dabei zu unschönen Effekten, wie großen weißen Rändern oder umgekehrt zu abgeschnittenen Beschriftungen am Rand. Schnelle Abhilfe schafft hier in den meisten Fällen die Funktion plt.tight_layout(). Diese muss nach dem Plotbefehl und vor dem Speicherbefehl aufgerufen werden und benötigt keine Parameter.

Nun haben Sie die Grundlagen des Plottens mit Jupyter kennen gelernt und sind bereits in der Lage einen übersichtlichen, publikationsreifen, Plot zu erzeugen. In Abb. 4.12 sehen Sie alle bisher präsentierten Features in Aktion.

In nächsten Abschn. 4.3 werden wir das Thema Diagramme vertiefen und Beispiele für aufwändigere Plots kennen lernen.

Abb. 4.12

Die wichtigsten Befehle für das Erzeugen, Anpassen und Speichern eines Diagramms in matplotlib.pyplot auf einen Blick

4.3 Plotten für Fortgeschrittene

Hier lernen Sie ...

  • die Schriftgrößen und Schriftarten von Beschriftungen anzupassen,

  • Features im Plot mit Linien und farbigen Bereichen hervorzuheben,

  • den Unterschied zwischen funktionsorientiertem und objektorientiertem Plotten kennen,

  • Diagramme mit zwei y-Achsen anzulegen,

  • Ihrem Plot Zoom-Fenster hinzuzufügen,

  • 3D-Diagramme zu erstellen,

  • und Formeln in Beschriftungen zu verwenden.

Schriften und Schriftgrößen
Jede Beschriftung – dazu gehören Achenbeschriftungen, Plottitel, usw. – kann individuell durch die zusätzlichen Argumente
im Funktionsaufruf modifiziert werden. Für die Schriftfamilie stehen dabei, wenn es bei der Installation keine Probleme gab, mindestens folgende Optionen zur Verfügung:
Die Funktionen
definieren das Erscheinungsbild von Beschriftungen global für das gesamte Notebook9. In Abb. 4.13 sehen sie diese Befehle in Aktion. Mit dem Befehl plt.style.use("default") kehren Sie zu den Standardeinstellungen zurück.
Abb. 4.13

Globale und lokale Anpassung der Schriftgröße und Schriftart von Beschriftungen

Hervorhebungen und Erläuterungen
Interessante Features in Ihrem Graphen können Sie für Ihre LeserInnen farblich hervorheben, wie in Abb. 4.14 zu sehen. Vertikale bzw. horizontale Linien erhalten Sie mit den Funktionen

Als Minimalinput benötigen diese die Position (x oder y) der Linie in den Einheiten der jeweiligen Achse. Das Erscheinungsbild der Linien können Sie über die gleichen Argumente anpassen, die wir bereits bei der Liniengestaltung in Abschn. 4.2 kennen gelernt haben. Als Grundeinstellung werden durchgezogene Linien in den Farben der Standardpalette verwendet.

Wenn Sie größere Bereiche Ihres Plots farblich hervorheben möchten, sind die Funktionen
das Mittel der Wahl. Die Funktionen benötigen mindestens die untere und obere Grenze der Bereichs (xmin, xmax bzw. ymin, ymax). Darüber hinaus lasst sich auch ihr Aussehen sich mit den Parametern aus Abschn. 4.2 weiter einstellen. Wenn Sie Linien oder Bereiche mit dem Parameter label="..." beschriften, erscheinen diese außerdem in der Legende.
Abb. 4.14

Hervorhebungen mit Linien und Bereichen

Funktionsorientierung und Objektorientierung
Um das Erscheinungsbild einer Diagrammkomponente verändern zu können ist es praktisch zu wissen wie diese im matplotlib-Jargon heißt. Eine Übersicht dazu finden Sie in Abb. 4.15. Bei der Online-Suche nach diesen Komponenten und Verwendung von Code-Beispielen wird Ihnen wahrscheinlich ziemlich bald auffallen, dass es neben den bisher bekannten Befehlen noch eine alternative Syntax gibt. Das Paket matplotlib bietet nämlich zwei Möglichkeiten an einen Plot heranzugehen, die sich in ihren Grundprinzipien unterscheiden. Schauen wir uns beide am besten an einem Beispiel an, der Erstellung eines einfachen Plots. In beiden Fällen verwenden wir dabei die früher definierten Arrays x_werte und y_werte.
Abb. 4.15

Die wichtigsten Bestandteile eines matplotlib-Diagramms mit ihren Bezeichnungen im matplotlib-Jargon. Die Vorlage dieser Abbildung sowie den Code um sie zu erstellen finden Sie unter https://​matplotlib.​org/​devdocs/​gallery/​showcase/​anatomy.​html

  • Funktionsorientiertes Plotten: Das ist unsere „herkömmliche“ Methode. Funktionen werden über die Paketabkürzung plt aufgerufen und produzieren Output.
  • Objektorientiertes Plotten: Hier werden zunächst Objekte10 erzeugt. In dem Beispiel sind es die Abbildung fig und das darin enthaltene Diagramm ax. Anschließend werden sie über eingebaute Funktionen bzw. Methoden verändert.

Beide Codes führen zum gleichen Diagramm. Welcher Weg ist nun der bessere? Das ist Geschmackssache. Als Faustregel gilt: Bei einfachen Plots führt der funktionsorientierte Zugang meist schneller zum Ziel. Bei komplizierten Plots hat der objektorientierte Zugang oft Vorteile weil er mehr Möglichkeiten bietet einen Plot anzupassen. Praktischerweise können Sie beide Stile auch beliebig mischen, ganz wie Sie es für Ihr Ergebnis brauchen. Bei den nun folgenden Beispielen von aufwändigeren Diagrammen für Fortgeschrittene werden beide Stile zum Einsatz kommen.

Diagramm mit zwei y-Achsen
Diese Diagrammart macht Sinn wenn zwei Größen eine gemeinsame Abhängigkeit besitzen (z. B. von der Zeit) aber eine Darstellung auf einer y-Achse, beispielsweise wegen unterschiedlicher Einheiten, nicht möglich ist. Ein aktuelles Beispiel bieten die Zeitverläufe der $$\textrm{CO}_2$$-Konzentration in der Atmosphäre und der globalen Temperatur, die in Abb. 4.16 zusammen mit dem dazugehörigen Code dargestellt sind. Hier wird durchgehend der funktionsorientierte Stil genutzt. Mit dem Befehl plt.twinx() wird ein neues Diagramm erzeugt, das sich die x-Achse mit dem ursprünglichen teilt, und als aktuelles Diagramm festgelegt. Alle darauf folgenden Befehle wirken sich deshalb nur auf dieses Diagramm aus. Wie man sieht, können außerdem auch die Farben der Beschriftungen mit dem optionalen Parameter color angepasst werden.
Abb. 4.16

Temperatur und $$\textrm{CO}_2$$-Konzentration für die vergangenen 400.000 Jahre

Plot im Plot

Die Funktion inset_axes() erlaubt es Ihnen, Bereiche eines Graphen in einem Unterfenster vergrößert darzustellen. Damit lassen sich z. B. interessante Features einer Messreihen hervorheben, ohne dass ein neuer Plot notwendig wird. In dem Code-Beispiel (Abb. 4.17) sehen sie den objektorientierten Stil in Aktion. Nachdem das Hauptdiagramm auf diese Weise erzeugt ist, wird mit axins ein neues Diagramm angelegt. Dieses wird anschließend, ganz analog zum Hauptdiagramm, bearbeitet. Hier wird die Position und Größe des kleinen Diagramms in relativen Einheiten angegeben11. Alternativ lassen sich diese auch in den Einheiten der x- und y-Achse angeben, was z. B. so aussehen könnte:

ax.inset_axes([0.25, 2, 0.75, 1.5], transform=ax.transData).
Abb. 4.17

Diagramm mit vergrößertem Bereich

3D-Diagramme
Ein dreidimensionales Diagramm kann z. B. so aussehen wie in Abb. 4.18. Der Code ähnelt dem für ein zweidimensionales Diagramm. Der Hauptunterschied ist der Parameter projection="3d" bei der Erzeugung des Diagrammobjekts. Befindet sich Ihr Notebook im interaktiven Modus, dann lässt sich der Plot mit der Maus rotieren. Unter https://​matplotlib.​org/​stable/​tutorials/​toolkits/​mplot3d.​html finden Sie eine Übersicht der Möglichkeiten von 3D-Plots mit zahlreichen Beispielen.
Abb. 4.18

Räumliches Diagramm einer Parabel

In der Praxis sollte man bei der Verwendung von 3D-Plots beachten, dass das Ablesen der Achsen nicht immer eindeutig ist. In bestimmten Fällen können sie aber Zusammenhänge besonders anschaulich illustrieren.

Sonderzeichen und Formeln
In Formeln, gängigen Abkürzungen von physikalischen Größen und auch in ihren Einheiten steht man oft vor „typographischen Herausforderungen“. Das können griechische Buchstaben, tief- oder hochgestellte Zeichen oder sonstige Sonderzeichen sein. Einige davon begegnen uns auch in diesem Buch:
Was tut man nun, sollte es notwendig werden solche Ausdrücke in Achsenbeschriftungen, in der Legende oder im Diagrammtitel zu verwenden? Praktischerweise kann matplotlib mit einigen Sonderzeichen, die direkt über die Tastatur eingegeben werden können, umgehen. Umlaute, ß, hochgestellte $$^2$$, $$^3$$ und sogar µ oder das Gradsymbol $$^{\circ }$$ stellen also kein Problem dar und können einfach an Funktionen wie plt.xlabel() übergeben werden. Es gibt aber auch Grenzen wie Sie in Abb. 4.16 sehen können. Hier konnte die Tiefstellung von $$\textrm{CO}_2$$ nicht dargestellt werden. Für solche Fälle besitzt matplotlib eine spezielle Syntax, die dem Mathematikmodus von LaTeX12 entlehnt ist. In Tab. 4.3 finden Sie Beispiele für mathematische Ausdrücke mit häufig verwendeten Elementen sowie den dazugehörigen Code um diese in matplotlib-Beschriftungen zu erzeugen. Mehr Anwendungsbeispiele und weiterführende Informationen finden Sie unter https://​matplotlib.​org/​3.​5.​0/​tutorials/​text/​mathtext.​html.
Tab. 4.3

Beispiele für die Darstellung von mathematischen Ausdrücken

Formel

Code für matplotlib-Beschriftungen

$$a + b - c \cdot d \times e^{42}$$

$$ x / y = \frac{x}{y} $$

$$f(x, y) = \sqrt{x^2 + y^2}$$

$$\alpha , \Omega , \omega $$

$$E = \gamma m_{0} c^{2}$$

$$\mathrm {E = \gamma m_{0} c^{2}}$$

$$\mathrm {g_{Erde} = 9,81~m s^{-2}}$$

Die wichtigsten Eigenschaften der Mathematiksyntax sind:
  • Beschriftungen mit Formeln werden mit Dollarzeichen $ ... $ eingerahmt und als raw strings übergeben, d. h. r"$ Formel $" statt "Formel".

  • Geschweifte Klammern {...} werden für die Strukturierung von Formeln verwendet und erscheinen nicht in der finalen Darstellung.

  • die meisten Sonderzeichen und Formelelemente werden mit speziellen Befehlen erzeugt, die immer mit einem Backslash \...  beginnen. Haben diese Befehle Argumente, so stehen sie in geschweiften Klammern: \Befehl{Argument}.

  • Standardmäßig werden mathematische Ausdrücke in matplotlib kursiv dargestellt. Eine aufrechte Schreibweise erreichen Sie bei Bedarf mit dem Befehl \mathregular{...}. Dieser wird innerhalb der Mathematikumgebung $...$ um die Beschriftung gesetzt:

    r"$ \mathregular{Formel} $" statt r"$ Formel $"

  • Gewöhnliche Leerzeichen werden im Mathematikmodus ignoriert. Abstände z. B. zwischen Größe und Einheit erhalten Sie mit einer Tilde (~, einfaches Leerzeichen).

Zum Glück muss sich sich nicht den Code für alle Sonderzeichen merken. Auf der Seite von Detexify unter http://​detexify.​kirelabs.​org/​classify.​html können Sie das gesuchte Symbol mit der Maus zeichnen und bekommen Zeichenvorschläge sowie den dazugehörigen Code.

Diese Formelsyntax kann übrigens auch in Textzellen eines Jupyter-Notebooks verwendet werden. Dazu müssen Sie den Ausdruck mit einfachen Dollarzeichen $ ... $ (für die Darstellung im Fließtext) oder mit doppelten Dollarzeichen $$ ... $$ (für freistehende Formeln) einrahmen. Das erlaubt es Ihnen z. B. komplizierte Formeln und ausgefallene Sonderzeichen zunächst in einer Textzelle zu testen.

Nun sind Sie in der Lage Ihre Ergebnisse in einem publikationsreifen Plot darzustellen und kennen sogar einige fortgeschrittene Features. In den nächsten Kapiteln werden Sie mit dem Umgang mit Unsicherheiten und der Modellanpassung weitere Methoden kennen lernen um diese Ergebnisse zu erhalten.