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, das 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 usn 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 Visualisierung für solche Daten sind Histgramme.
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 nun mit 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 desweiteren 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: