Skip to main content

Datenvisualisierung mit Matplotlib

Die Programmiersprache Python ist in der Wissenschaft und im Bereich Data Science stark verbreitet. Da in diesen Bereichen Datenvisualisierung eine zentrale Rolle spielt, gibt es viele verschiedene Bibliotheken zur Datenvisualisierung. Eine sehr etablierte Bibliothek zur Datenvisualisierung ist Matplotlib. Wie es der Name schon sagt, war ursprünglich das Ziel von Matplotlib, Plotting-Funktionalität wie in Matlab auch in Python zur Verfügung zu stellen. Inzwischen wurde dieses Ziel mehr als erreicht. Matplotlib unterstützt eine Vielzahl von verschiedenen 2D und 3D Plots, wie sie sich auf der Beispielseite von Matplotlib schnell selber vergewissern können.

Um Plots mit Matplotlib zu erstellen, organisieren wir die zu plottenden Daten in Listen, und rufen dann die entsprechende Plot Prozedur auf. Im folgenden diskutieren wir exemplarisch einige der wichtigsten Typen von Plots die wir für die Visualisierung unserer Simulationen später verwenden werden.

Einbinden der Matplotlib Bibliothek

Matplotlib gehört nicht zum Standardumfang von Python, sondern muss separat auf dem System installiert werden. Auf Ihrer Umgebung ist dies bereits gemacht.

Um mit Matplotlib arbeiten zu können, müssen wir die Befehle von Matplotlib zuerst in Python bekannt machen. Dies geschieht, indem wir jeweils am Anfang des Programms folgende Zeile schreiben:

from matplotlib.pyplot import *

Plotten einer Funktion mit Linienplots

Der einfachste und am häufigst benötigte Plot ist der Linienplot. Hier werden Punkte als x y Koordinate interpretiert. Die x-Koordinaten und die y-Koordinaten werden dabei jeweils in eine eigene Liste geschrieben. Die Punkte werden dann jeweils durch eine Linie verbunden. Der folgende Code illustriert wie man solche Plots erstellt:

Experimente

  • Was passiert, wenn Sie das dritte Argument (also "-") durch folgende Strings ersetzen: "*", ".", "-*", "g", "r", "g*-", "k*-"?
  • Was macht also das dritte Argument?
  • Führen Sie die plot Prozedur zweimal hintereinander mit unterschiedlichen Werten für y aus. Was passiert?

Generieren der Wert

In obigem Beispiel haben wir die y-Werte fix angegeben. Häufig möchten wir aber, dass die y-Werte durch eine Funktion aus den x-Werten berechnet werden. Wir möchten also, dass wir für x-Werte [x[0], x[1], ..., x[n]] die y-Werte f(x[0], f(x[1]), ..., f(x[n])) erhalten, wobei f eine Funktion ist.

Mit dem, was wir bisher gelernt haben, können wir dies problemlos programmieren. Zuerst definieren wir uns eine Funktion, die wir plotten möchten:

def f(x):
return 0.5 * x - 2.0

Nun erstellen wir uns eine Liste mit den Werten der x-Achse. Da es zu mühsam ist, alle Werte immer manuell anzugeben, schreiben wir uns eine Funktion, welche den Start- und Endpunkt eines Intervals entgegennimmt. Als drittes Argument geben wir an, wieviele Punkte wir dazwischen auswerten wollen. Wir nennen die Funktion linspace:

def linspace(a, b, num_points):
xs = []
for i in range(0, num_points):
delta = (b - a) / (num_points - 1)
xs.append(a + i * delta)
return xs

Nun können wir die Funktion f an jeder Stelle auswerten. Da auch dies ein übliches Muster ist, schreiben wir uns dafür eine Funktion, die die entsprechenden y-Koordinaten zurückgibt.

def values_for_xs(xs):
ys = []
for x in xs:
ys.append(f(x))
return ys

Nun können wir wie vorher diese Daten plotten:

xs = linspace(-5, 5, 200)
ys = values_for_xs(xs)
plot(xs, ys, "-")
show()

Probieren Sie dies doch gleich mit Ihren eigenen Funktionen aus:

Kombinieren mehrerer Plots

Häufig wollen wir nicht nur den Verlauf einer Kurve plotten, sondern den Verlauf mehrerer Funktionen vergleichen. In diesen Fällen können wir einfach mehrfach hintereinander die Plot Prozedur aufrufen. Um diese unterscheiden zu können, versehen wir diese noch mit einem label. Angenommen, die y-Werte für eine erste Funktion sind in der Liste ys_fun1 und die Werte für die zweite Funktion sind in der Liste ys_fun2 gespeichert. Dann würden wir diese wie folgt plotten:

plot(xs, ys_fun1, label="Funktion 1")
plot(xs, ys_fun2, label="Funktion 2")
legend()
show()

Die legend Anweisung bewirkt, dass im Plot eine Legende angezeigt wird.

Histogramme

Häufig haben wir Daten nicht als Verlauf mit einer Ordnung, sondern nur als Menge gegeben. Ein typisches Beispiel sind die Übungsresultate von Studierenden. Uns interessiert nun nicht der Verlauf einer Kurve, sondern die Verteilung der Punkte. Eine geeignete Visualisierungsart für solche Daten sind Histogramme. Mit Matplotlib geht dies mit dem Befehl hist. Als erstes Argument wird eine Liste übergeben, und das zweite Argument ist die Anzahl bins, in welche die Daten zusammengefasst werden sollen.

achieved_points = [10, 8, 9, 10, 8, 8, 1, 6, 8, 9, 10, 9, 5]
hist(achieved_points, 10)
show()

Versuchen Sie auch hier die hist Anweisung besser zu verstehen, indem Sie direkt damit experimentieren.

Boxplots

Eine in der Statistik verbreitete Art der Datenvisualisierung sind Boxplots. Bei Boxplots gehen wir davon aus, dass wir unsere Daten in Gruppen aufteilen können. Innerhalb dieser Gruppen haben wir dann verschiedene Messwerte. Ein typisches Beispiel wäre die Schuhgrösse von Männern und Frauen. Männer und Frauen bilden die zwei Gruppen, und die Messwerte innerhalb der Gruppen entsprechen der Schuhgrösse. In Python repräsentieren wir solche Daten mit Listen von Listen.

men_shoesize = [43, 41, 42, 44, 45, 43, 41, 39, 44]
women_shoesize = [38, 37, 39, 41, 36, 40, 41, 42]
data = [men_shoesize, woman_shoesize]

Diese plotten wir mittels der Prozedur boxplot.

boxplot(data)

Probieren Sie auch diese Funktionalität gleich selber aus:

Tabellen und Matrizen visualisieren

Zum Schluss diskutieren wir noch eine nützliche Visualisierungsfunktionalität, die uns erlaubt tabellarische Darstellungen von Zahlen, wie beispielsweise Matrizen oder Bilder zu visualisieren. Auch hier sind die Daten als Liste von Listen gegeben. Es gilt aber des Weiteren die Einschränkung, dass jede innere Liste dieselbe Länge haben muss. Zum Beispiel wäre folgende Liste von Listen eine gültige Tabelle:

table = [[11,12,13], [21,22,23], [31,32,33]]

während dies Liste keine gültige Tabelle darstellt, da die zweite Liste zu kurz ist:

table_invalid = [[11, 12, 13], [21], [31, 32, 33]]

Immer wenn wir solche Daten haben, können wir diese mit imshow visualisieren. Dabei wird der Wert jedes Elements als Farbwert interpretiert. Zum Beispiel würde folgender Aufruf ein Quadrat anzeigen.

square = [[0, 0, 0, 0], [0, 1, 1, 0], [0, 1, 1, 0], [0, 0, 0, 0]]
imshow(square)
show()

Mit einem etwas komplexeren Beispiel können Sie im folgenden Trinket experimentieren: