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.
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.
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

ein Array mit x-Werten,
ein Array mit y-Werten, und
die Funktion plt.plot()

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.

Ein einfacher Plot einer Messreihe mit Punktmarkern

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


aus6.


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.



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


Diagramm mit Fehlerbalken
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.

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: Definiert das Aussehen der Datenpunktmarker.
markersize: Legt die Größe der Datenpunktmarker fest.
linestyle: Definiert den Strichstil einer Linie.
linewidth: Definiert die Linienbreite.
Ü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) |
Übersicht gängiger Linienstile
Code | Kurz-Code | Beschreibung |
---|---|---|
|
| Keine Linie |
|
| Durchgezogen |
|
| Gestrichelt |
|
| Gepunktet |
|
| Striche und Punkte abwechselnd |

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

Plot mit expliziter Angabe des Strichtyps und der Breite der Linie


Mehrere Funktionen in einem gemeinsamen Diagramm mit automatischer Farbgebung
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.
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.

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.





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

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.


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.


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

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.

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.

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.




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

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.


Hervorhebungen mit Linien und Bereichen

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.


Temperatur und -Konzentration für die vergangenen 400.000 Jahre
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:

Diagramm mit vergrößertem Bereich

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.





Beispiele für die Darstellung von mathematischen Ausdrücken
Formel | Code für matplotlib-Beschriftungen |
---|---|
| |
| |
| |
| |
| |
| |
|
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.