6 Graphische Darstellungen mit Matplotlib Matplotlib ist eine Bibliothek zur Erzeugung graphischer Darstellungen. In diesem Kapitel wird gezeigt, wie einfache 2D-Darstellungen zur Visualisierung von Daten erstellt werden können. 6.1 Hinweis zur Installation Matplotlib gehört nicht zum Standardumfang von Python und muss deshalb zunächst heruntergeladen und installiert werden. Die Matplotlib-Homepage ist unter der folgenden Webadresse zu finden: http:// matplotlib.sourceforge.net/ Dort gibt es auch eine Download-Seite. Wenn Sie unter MS-Windows arbeiten, können Sie die Installationsdateien mit einer Anleitung im PDF-Format auch von der folgenden Webadresse herunterladen: http://mbi-wiki.uni-wuppertal.de/python/python-buch/ 6.2 XY-Diagramme Eine der häufigsten graphischen Darstellungen ist das XY-Diagramm. Mit solchen Diagrammen werden beispielsweise zeitabhängige Verläufe von Funktionen präsentiert. Als Beispiel soll hier die Funktion y(t) = 5 sin(t) betrachtet werden, die im folgenden Diagramm dargestellt ist. Abb 6.1 XY-Diagramm der Funktion y(t)=5*sin(t)
184 6 Graphische Darstellungen mit Matplotlib Mit dem folgenden Programm wird das Diagramm erzeugt: Diskussion import matplotlib.pyplot as plt #1 import numpy as npy #2 t = npy.arange(0.0, 6.29, 0.1) #3 y = 5*npy.sin(t) #4 plt.plot(t, y, linewidth=2) #5 plt.xlabel('zeit in Sekunden') #6 plt.ylabel('y(t)') #7 plt.title('die Funktion y(t)=5*sin(t)') #8 plt.grid(true) #9 plt.show() #10 Durch die import-anweisungen (#1,#2) werden die Namen der Module pylab (Matplotlib) und Numpy verfügbar bereitgestellt. Im folgenden Programm werden sowohl Funktionen von Numpy (siehe Kapitel 5) als auch von Mat-plotlib benutzt. Mit der arange-funktion aus Numpy (#3) wird der Variablen t eine Liste von Dezimalzahlen zugewiesen. Es handelt sich um eine Liste mit dem Startwert 0.0, dem Endwert 6.28 und der Schrittweite 0.01. In der folgenden Zeile wird die Sinus-Funktion berechnet (#4). Dabei wird keine Schleife verwendet, sondern die komplette Liste t an die Sinus-Funktion aus dem Numpy-Modul übergeben (Vektoroperation, siehe Kapitel 5). Danach wird das Diagramm erzeugt (#5), aber noch nicht angezeigt. Der Aufruf der Methode plot() legt fest, dass die Werte der Liste y über t aufgetragen werden. Dabei wird der Graph mit einer Liniendicke von 2 Pixeln erzeugt. Zu der so - virtuell - erzeugten Graphik werden nun Zusatzinformationen hinzugefügt (#6). Mit xlabel() wird eine Beschriftung der horizontalen Achse vorgegeben. Entsprechend wird mit ylabel() eine Beschriftung der vertikalen Achse vorgenommen (#7) und xtitle() setzt eine Überschrift über die Grafik (#8, vergleiche Abb. 6.1). Durch Aufruf der Methode grid() mit dem Parameter True wird ein dünnes, gestricheltes Liniennetz im Diagramm erzeugt (#9). Erst nach der Definition aller Merkmale des Diagramms wird die Anzeige (#10) durch Aufruf der Methode show() aktiviert. In einem separaten Anzeigefenster wird die Grafik dargestellt. Mit wenigen Befehlen lässt sich so ein professionelles XY-Diagramm erzeugen (siehe die folgende Abbildung 6.2). Wird das Fenster nicht mehr gebraucht, kann es durch Anklicken des Kreuzsymbols geschlossen werden (obere rechte Ecke).
6.2 XY-Diagramme 185 Hinweis Möglicherweise ist die Python-Shell nach der Ausführung des gerade beschriebenen Programms blockiert. Auch diese Shell muss dann geschlossen werden, um zum Programm zurückzukehren. Es handelt sich hier um ein - bekanntes - Problem des Matplotlib-Paketes, das sicher in einer der nächsten Versionen behoben wird. Abb 6.2 Matplotlib-Ausgabefenster Am unteren Rand dieses Ausgabefensters sind einige Befehls-Icons zu sehen, die sehr hilfreiche Funktionen bereithalten. Sie sollen im Folgenden besprochen werden. Mit dem Befehl kann das Bild als Datei gespeichert werden. Es stehen hierzu eine Vielzahl unterschiedlicher Bildformate bereit. Es muss ein Name für das Bild eingegeben und das gewünschte Format ausgewählt werden. Zur Nachbereitung in einem professionellen Bildbearbeitungsprogramm kann beispielsweise das Bild im TIFF-Format gespeichert werden, welches aber sehr große Dateien erzeugt. Zur Präsentation eines Diagramms im Internet oder in einem Textdokument bietet sich das png-format (sprich "ping") an. Weitere wichtige Speicherformate sind PDF und JPEG. Das letztere ist von den Digitalkameras bekannt, die Photographien in diesem Format speichern. Jedoch ist die Vielzahl der Farben, die JPEG verwalten kann, für Diagrammdarstellungen eigentlich nicht notwendig. Ein weiteres interessantes Format ist SVG (Scalable Vector Graphics). Wird eine solche Graphik in Internetdokumente eingebunden, so kann sie fast verlustfrei vergrößert werden. Der Befehl öffnet ein kleines Folgefenster, mit dessen Hilfe die Ränder der Graphik interaktiv verstellt werden können. Entspricht das Ergebnis nicht den Erwartungen, kann mit Reset der Ursprungszustand wieder hergestellt werden.
186 6 Graphische Darstellungen mit Matplotlib Wird die Maus über das erzeugte Diagramm bewegt, so wird in der unteren rechten Ecke des Fensters die aktuelle Mausposition angezeigt. So ist es möglich, auch die angenäherten Funktionswerte abzulesen, in dem der Mauszeiger über den Graphen bewegt wird. Mit dem Befehl ist es möglich, einen Bereich der Graphik zu vergrößern. Hierzu muss mit dem Mauszeiger (bei gedrückter linker Maustaste) ein Rechteck über den zu vergrößernden Bereich gezogen werden. Entsprechend kann mit dem Befehl der anzuzeigende Bereich verschoben werden. Mit den Befehlen und kann ein Befehl rückgängig gemacht bzw. wiederholt werden. Schließlich lässt sich der Ursprungszustand der Graphik mit wiederherstellen. Soll mehr als eine Funktion in einem XY-Diagramm dargestellt werden, so muss lediglich der Aufruf der plot()-methode etwas abgewandelt werden. Das wird nachfolgend am Beispiel eines Diagramms gezeigt, in dem die Sinus- und die Kosinus- Funktion dargestellt sind. Die Import-Anweisungen werden aus Platzgründen nicht mehr gezeigt. t = npy.arange(0.0, 6.4, 0.1) y = 5*npy.sin(t) z = 3*npy.cos(t) plt.plot(t, y, "r+", t, z, "bo", linewidth=2.0) #1 plt.xlabel('zeit in Sekunden') plt.ylabel('y(t)') plt.title('die Funktionen y(t)=5*sin(t) und z(t)=3*cos(t)') plt.grid(true) plt.show() Durch dieses Programm wird die folgende Graphik erzeugt. Die Graphen bestehen jetzt aus einer Punktfolge. Abb 6.3 XY-Diagramm der Funktionen y(t)=5*sin(t) und z(t)=3*cos(t) (Darstellung durch Symbole)
6.2 XY-Diagramme 187 Bei der Erstellung des Diagramms wurden die Beschriftungen angepasst. Wesentliche Änderungen wurden aber nur beim Aufruf der plot()-methode ausgeführt. Sollen mehrere Funktionsverläufe dargestellt werden, so wird diese Methode folgendermaßen aufgerufen: plot(t 1,y 1,c 1,t 2,y 2,c 2,t 3,y 3,c 3...) wobei t i und y i jeweils zwei zusammengehörende Listen mit Werten für Abszisse und Ordinate sind (i=1,2,...). Die Konstanten c i enthalten einen String, mit dem die Erscheinungsform der Kurve gesteuert wird. Das erste Zeichen des Strings kontrolliert die Farbe, das zweite steht für ein Symbol, mit dem der Funktionswert dargestellt wird. Bei dem vorliegenden Beispiel bedeutet "r+", dass der Funktionsverlauf in roter Farbe (r=red) mit einem Pluszeichen an jedem Funktionswert erzeugt wird. Der String "bo" erzeugt dagegen eine blaue Kurve (b=blue) mit einem Kreis zur Markierung des Funktionswertes. Die Strings können auch ganz entfallen. Dann werden kontinuierliche Kurven gezeichnet. Matplotlib bestimmt die Farben über eine Voreinstellung. Außerdem können die Strings auch aus drei Zeichen aufgebaut sein. Die folgende Graphik (Abb. 6.4) wurde mittels der plot()-methode plt.plot(t, y, "r+-", t, z, "bo-", linewidth=2.0) erzeugt. Die Symbole werden dann durch Linien miteinander verbunden. Das wird durch das dritte Zeichen im String "-" ausgedrückt. Abb 6.4 XY-Diagramm mit Symbolen und Linienstücken 6.3 Balken-Diagramme Mit der Methode bar() kann ein vertikales Balkendiagramm erstellt werden. Die Wirkungsweise soll wieder an einem Beispiel verdeutlicht werden. Mit dem folgenden Programm soll eine Umsatzentwicklung über die Quartale des Jahres 2011 dargestellt werden.