Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen...
Transcript of Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen...
Ein gutes Bild sagt mehr als tausend WorteDatenverarbeitung und Visualisierung mit Python
Jan Kohler Lars Berger Christian Drews
7.-8. April 2014
1 / 93
Ubersicht
Warum Python?
Erste Schritte in Python
numpy/scipy
matplotlib
2 / 93
Warum Python?
Python ist ...
einfach,
schnell,
frei verfugbar (open source),
besitzt eine Vielzahl von Erweiterungen (Modulen),
sowohl zur Verarbeitung und Darstellung von Daten geeignet,aber auch als Programmiersprache fur komplexe Softwareprojekte.
I YoutubeI GoogleI EVE OnlineI ...
3 / 93
Was uns erwartet ...
>>> import pylab
>>> DatenX, DatenY = lade_daten("./Daten/Wetter.dat")
>>> Ax = pylab.figure().gca()
>>> Ax.plot(DatenX, DatenY, lw = 2, label = "Wetter")
>>> Ax.set_ylabel("Temperatur")
>>> (...)
4 / 93
Woher bekomme ich Python?
Windows:www.python.org:
Offizielle Webseite
Dokumentation und Tutorials ...
Nur die Basispakete!
Python(x,y) -http://code.google.com/p/pythonxy
Alle wichtigen Zusatzmodule
Gangige Editoren und Entwicklungsumgebungen
Alles was man braucht!
Linux: Normalerweise vorinstalliert
Mac: Normalerweise vorinstalliert
5 / 93
Die Spyder Konsole... bereitet alles zum interaktiven Arbeiten vor:
6 / 93
Erste Schritte
Einfaches Anwendungsbeispiel:
>>> t = arange(100)
>>> f = 0.02
>>> plot(sin(2*pi*f*t))
>>> sqrt(9)
3
>>> log(100) + (4+3)*2
18.6051701
>>> a = 14.32
>>> b = sqrt(0.04)
>>> a * sqrt(a - b**3) + sin(a**2 +b)
...
Bye bye Windows Taschenrechner!7 / 93
Spyder Interactive Development Environment“Spyder is a powerful interactive development environment for the Python language withadvanced editing, interactive testing, debugging and introspection features”
8 / 93
Erste Schritte in Python I
Grundlegende Befehle:
print ’Hallo Welt’
x = 2 #Setze x = 2
print "x = ", x #Ausgabe: x = 2
print "x + 2 = ", x+2 #Ausgabe: x + 2 = 4
print "x * 2 = ", x*2 #Ausgabe: x * 2 = 4
print "x^2 = ", x**2 #Ausgabe: x^2 = 4
print - Ausgabe von Daten
# - Kommentare
x =... - Variablen konnen direkt zugewiesen werden
Ausprobieren!
9 / 93
Erste Schritte in Python II
Variablenzuweisung in Python:i = 2 #Integer
f = 2.0 #Float
s = ’Dies ist ein String’ #String
s = i #s ist jetzt ein Integer
Das Gleiche in C++:int i = 2; //Integer
float f = 2.0; //Float
char[] s = "Dies ist ein String"; //String
Vorsicht: (Implizite Typisierung)
a = 1.0
print a/2 # -> 0.5
b = 1
print b/2 # -> 0 !!!
print b/2.0 # -> 0.5
10 / 93
Erste Schritte in Python II
Weitere Datentypen: Listen (list)
a = [’Hund’, ’Katze’, 100, 2.0]
print a # -> [’Hund’, ’Katze’, 100, 2.0]
print a[1] # -> ’Katze’
print a[0:2] # -> [’Hund’, ’Katze’]
print a[2:] # -> [100, 2.0]
print a[2:]*2 # -> [100, 2.0, 100, 2.0]
print len(a) # -> 4
a[1] = ’Hund2’ # -> Ersetzt ’Katze’
print a # -> [’Hund’, ’Hund2’, 100, 2.0]
a[0] = [1, 2] # Verschachtelte Listen
print a # -> [[1, 2], ’Hund2’, 100, 2.0]
a.sort() # a wird sortiert (Methode!)
print a # -> [2.0, 100, [1, 2], ’Hund2’]
Funktioniert fur beliebige Datentypenslices (a[:3]) sind ein nutzliches WerkzeugListen sind Objekte mit Methoden (sort)
11 / 93
Erste Schritte in Python II
Aufgaben:
Benutze die Hilfe um mehr uber Listen (list) zu erfahren
Erstelle eine beliebige Liste a=[...]
Welche Methoden haben Listen?
Wozu dient append und reverse?
Kehre die Reihenfolge der Elemente der Liste um.
Erstelle eine neue Liste, die nur die ersten beiden Elemente enthalt.
a = [’Hund’, ’Katze’, 100, 2.0]
a.reverse()
print a
b = a[0:2]
12 / 93
Erste Schritte in Python III
if und else:y = 5 #
if y < 0: # Wenn < 0
print "negativ" #
elif y == 0: # Wenn voriges if ’wahr’, teste ob y = 0
print "Null" #
else: # Wenn keine Bedingung ’wahr’, dann:
print "positiv" #
if y > 10 and y < 20:
print "y liegt zwischen 10 und 20"
if y < 10 or y > 20:
print "y liegt nicht zwischen 10 und 20"
Python benutzt Einruckung! (Vorsicht)
Fur Vergleiche wird == benutzt!x=2 ist eine Zuweisung, x==2 ein Vergleich.
Bedingungen lassen sich beliebig mit and und or verknupfen
13 / 93
Erste Schritte in Python III
Beispiel:y = 2
if y % 6. == 0:
print "y ist durch 6 teilbar"
Aufgabe:
Benutze eine if- Abfrage um y=0 zu setzen, falls y negativ ist.
y = -1
print ’y = ’, y # -> y = -1
if y < 0: # teste ob y negativ ist
y = 0 # setze y = 0
print ’y = ’, y # -> y = 0
14 / 93
Erste Schritte in Python IV
Schleifen:for i in [’Hund’, ’Katze’, 100, 2.0]: # Fuer jedes Element in []:
print "i = ",i # -> i = Hund ...
print range(10) # -> [0, 1, 2, ... 8, 9]
for i in range(10):
print "i = ", i
Aufgabe:
Schreibe eine for-Schleife mit range(10), aber gib nur die i aus, die > 5
sind.
for i in range(10):
if i > 5:
print i
15 / 93
Erste Schritte in Python IV
Aufgabe:
Erstelle eine Liste, die die Quadrate aller Zahlen von 0 bis 99 enthalt.D.h.: [0, 1, 4, 9, 16, 25, ...]
Hinweis: Benutze eine for-Schleife
Hinweis: Beginne mit einer leeren Liste und erweitere mit .append()
quadrate = []
for i in range(100):
print i, i*i
quadrate.append(i*i)
print quadrate
16 / 93
Grundlegende Konzepte I
Datei Ein/Ausgabe: read
f = open("data/bsp1.txt", ’r’)
for line in f:
print line
f.close()
Ausprobieren!
Jede line wird als Text eingelesen. Wie kommen wir an die Zahlenwerte?
s = "10 15"
l = s.split() #-> l = ["10", 15"]
x = float(l[0]) #-> y = 10.0
y = float(l[1]) #-> x = 15.0
17 / 93
Grundlegende Konzepte I
Aufgabe:
Lese bsp1.txt ein und speichere die Zahlen der beiden Spalten in denListen X, Y.
Wende .split() auf line an.
Wandel die Strings in float um.
Benutze .append() um die Werte an X,Y anzuhangen.
X = []
Y = []
f = open("bsp1.txt", ’r’)
for line in f:
l = line.split()
X.append(float(l[0]))
Y.append(float(l[1]))
f.close()
Plot Beispiel: from pylab import * und plot(X,Y)18 / 93
Grundlegende Konzepte I
Datei Ein-/Ausgabe: write
f = open("ausgabe.txt",’w’)
f.write("Hallo Datei! \n")
f.close()
open(filename, ’r’) - Datei zum Lesen offnen
open(filename, ’w’) - Datei zum Schreiben offnen
open(filename, ’a’) - Daten werden an bestehende Dateiangehangt
Aufgabe:
Schreibe die Zahlen 0-100 in eine Datei.
f = open("ausgabe.txt", ’w’)
for i in range(101):
f.write(str(i)+"\n")
f.close()
19 / 93
Grundlegende Konzepte II
Funktionen:def quadrat(x): # definiere quadrat(x)
return x*x # x*x wird ’zurueck gegeben’
print quadrat(2) #-> 4
Default Argumente
def f(x, a=1, b=0): # definiere Funktion f()
y = a*x + b
return y # y wird ’zurueck gegeben’
print f(1, 2, 0) #-> 2
print f(1) #-> 1
Funktionen beginnen mit dem Keyword def
Es konnen beliebige Argumente (Zahl, String, Liste) ubergebenwerden
Auf Einruckung achten!
20 / 93
Grundlegende Konzepte II
Variablen innerhalb und außerhalb der Funktiondef f(x):
print "In f: Erhoehe x um 2"
x = x + 2
print "In f: x = ", x
return "fertig"
x = 1
print "Vor Aufruf von f: x =", x
s = f(x)
print "Nach Aufruf von f: x = ", x
Ausgabe:-> Vor Aufruf von f: x = 1
-> In f: Erhoehe x um 2
-> In von f: x = 3
-> Nach Aufruf von f: x = 1
21 / 93
Grundlegende Konzepte III
Aufgabe:
Schreibe eine Funktion, die in einer Liste alle Eintrage < -990 in 0 andert.[2.2, 3, 4.2, -999, 5] −→ [2.2, 3, 4.2, 0, 5]
Benutze eine for-Schleife, um auf die einzelnen Elemente zuzugreifen
Z.B.: for i in range( len(liste) ):
Benutze liste[i], um an die einzelnen Eintrage der Liste zugelangen
def clean_data(liste):
for i in range(len(liste)):
if liste[i] < -990:
liste[i] = 0
22 / 93
Grundlegende Konzepte III
Aufgabe: (simple Interpolation)
Schreibe eine Funktion, die in einer Liste alle Eintrage < -990 in denvorigen Eintrag andert.
[2.2, 3, 4.2, -999, 5] −→ [2.2, 3, 4.2, 4.2, 5]
range(5) erzeugt die Liste [0, 1, 2, 3, 4]
range(1, 5) erzeugt die Liste [1, 2, 3, 4]
def fix_data(liste):
for i in range(1, len(liste)):
if liste[i] < -990:
liste[i] = liste[i-1]
Eine nutzliche Funktion um einfache Datenlucken zu beheben.
23 / 93
Grundlegende Konzepte IVNutzliche Funktionen, die haufiger gebraucht werden, lassen sich inseparate Module auslagern.
Module
Lege mit Spyder die Datei tools.py an
Kopiere interpolate data nach tools.py
Andere Dateien konnen nun tools importieren
import tools #importiere das Modul tools
liste = [2.2, 3, 4.2, -999, 5]
tools.fix_data(liste) #benutze fix_data aus tools
from tools import fix_data #importiere fix_data aus tools
fix_data(liste)
from tools import * #importiere alle Funktionen aus tools
Damit man auf ein Modul zugreifen kann, muss es
sich im gleichen Verzeichnis wie die ausgefuhrte Datei befinden, odersich in einem Unterverzeichnis befinden, odersich im PYTHONPATH befinden
24 / 93
Grundlegende Konzepte IV
Es gibt zahllose vordefinierte Module:
os/sys - Bieten Methoden um auf das Betriebssystem zuzugreifen(kopieren etc.)
math - Enthalt gangige mathematische Funktionen
datetime - Enthalt Methoden um Zeit und Datumsangaben zubearbeiten
gzip - Bietet direkten Zugriff auf gezippte Dateien
pyqt - Grafische Benutzeroberflachen (Qt)
numpy/scipy - Paket zum wissenschaftlichen Programmieren inPython
matplotlib - ”Bibliothek zum Erstellen publikationsreifer Grafiken”
...
25 / 93
Abschlussaufgabe: Einlesen und Darstellen von Daten
Aufgabe:
Haufig sind Datensatze komplexer aufgebaut:
Die Datei kuesten linien.dat enthalt die Kustenlinien vonKontinenten und Inseln.
Die einzelnen Kustenlinien sind durch ein > getrennt.1.78464 5.563564
0.19244 5.669954
-2.771612 4.951822
>
-3.434312 4.435222
...
Lese den Datensatz ein und plotte die einzelnen Kustenlinien.
Benutze die Befehle from pyplot import * und plot(X, Y)
Beginne mit X=[], Y=[]
Teste in jeder Zeile ob ein > vorkommt.I Wenn ja: Plotte alle bisher eingelesenen Daten und setze X=[], Y=[]I Wenn nicht: Benutze .append() um die Werte an X,Y anzuhangen.
26 / 93
Numpy
Numpy ...
ist eine Erweiterung (ein Modul) fur Python
ist genau wie Python frei verfugbar
ist schnell
liefert eine Vielzahl hilfreicher Funktionen
enthalt numpy arrays!
Numpy erleichtert den Umgang mit Daten!
27 / 93
Ruckblick: Erste Schritte
Erinnerung : Einfaches Anwendungsbeispiel:
>>> t = arange(100) # arange ist eine Numpy Funktion
>>> f = 0.02
>>> plot(sin(2*pi*f*t)) # sin ist eine Numpy Funktion
# pi kommt aus Numpy
>>> sqrt(9) # sqrt -> Numpy
3
>>> log(100) + (4+3)*2 # log -> Numpy
18.6051701
>>> a = 14.32
>>> b = sqrt(0.04)
>>> a * sqrt(a - b**3) + sin(a**2 +b)
...
28 / 93
Arrays I
Arrays sehen wie Listen aus
>>> l=range(10)
>>> l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # Liste
>>> a=arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) # Array
>>> l[:3] # Indizierung/Slicing
[0, 1, 2]
>>> a[:3] # Funktioniert auch bei Arrays
array([0, 1, 2])
29 / 93
Arrays I
Arrays sehen wie Listen aus ... sind aber anders
>>> l+1 # Mit Listen kann man
Traceback (most recent call last): # nicht rechnen
File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "int") to list
>>> l**2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: ...
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> a+1 # Mit Arrays geht es
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
>>> a**2
array([ 0, 1, 4, 9, 16, 25, 36, 49, 64, 81])
30 / 93
Ruckblick: Erste Schritte in Python IV
Erinnerung: Aufgabe:
Erstelle eine Liste, die die Quadrate aller Zahlen von 0 bis 99 enthalt.D.h.: [0, 1, 4, 9, 16, 25, ...]
Hinweis: Benutze eine for-Schleife
Hinweis: Beginne mit einer leeren Liste und erweitere mit .append()
quadrate = []
for i in range(100):
print i, i*i
quadrate.append(i*i)
print quadrate
31 / 93
Arrays I
Aufgabe:
Erstelle ein Array, das die Quadrate aller Zahlen von 0 bis 99 enthalt.D.h.: [0, 1, 4, 9, 16, 25, ...]
Hinweis: Benutze arange
Hinweis: Rechne mit dem Array
quadrate=arange(100) # Geht auch in einer Zeile
quadrate=quadrate**2 # quadrate=arange(100)**2
print quadrate
32 / 93
Arrays II
Arrays sehen wie Listen aus ...
>>> l=range(10)
>>> l[0]=5 # Man kann Eintraege aendern
>>> l[1]=l[2]+l[3] # und mit ihnen rechnen
>>> l
[5, 5, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a=arange(10) # Das geht auch mit Arrays
>>> a[0]=5
>>> a[1]=a[2]+a[3]
>>> a
array([5, 5, 2, 3, 4, 5, 6, 7, 8, 9])
33 / 93
Arrays II
Arrays sehen wie Listen aus ... sind aber anders
>>> l=range(10)
>>> l.append(20) # Listen kann man erweitern
>>> l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 20]
>>> a=arange(10)
>>> a.append(10) # Arrays nicht
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: ’numpy.ndarray’ object has no attribute
’append’
Vorsicht: Arrays sind keine Listen
>>> b=append(a,20) # Erweiterung eines Arrays
>>> b # nur durch eine Neuzuweisung
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 20])
34 / 93
Arrays II
Aufgaben:
Benutze die Hilfe, um mehr uber Arrays zu erfahren
Vergleiche die Methoden und Attribute von Listen und Arrays
Wozu dienen mean und was ist dtype bei Arrays?
Berechne den Mittelwert der ganzen Zahlen von 6 bis 33I mit einer ListeI mit einem Array
# mit Liste
summe=0.
anzahl=0.
for i in range(6,34):
summe=summe+i
anzahl=anzahl+1
mittelwert_liste=summe/anzahl
# mit Array
mittelwert_array=arange(6,34).mean()
35 / 93
Ruckblick: Erste Schritte in Python II
Erinnerung: Variablenzuweisung in Python:i = 2 #Integer
f = 2.0 #Float
s = ’Dies ist ein String’ #String
s = i #s ist jetzt ein Integer
Vorsicht: (Implizite Typisierung)
a = 1.0
print a/2 # -> 0.5
b = 1
print b/2 # -> 0 !!!
print b/2.0 # -> 0.5
36 / 93
Arrays III
Typen
>>> a=arange(10) # Typisierung implizit 10 -> int
>>> a/2
array([0, 0, 1, 1, 2, 2, 3, 3, 4, 4])
>>> a=arange(10.) # 10. -> float
>>> a/2
array([0., 0.5, 1., 1.5, 2., 2.5, 3., 3.5, 4., 4.5])
Vorsicht: Arrays haben einen festen Typ
>>> a=arange(10) # a -> Typ : int
>>> a[5]=10.5
>>> a
array([ 0, 1, 2, 3, 4, 10, 6, 7, 8, 9])
>>> a[5]="Hund"
Traceback (most recent call last): ...
ValueError: invalid literal for long() with base 10: ’Hund’
37 / 93
Arrays III
Erzeugen von Arrays
>>> arange(10) # Kennen wir bereits
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
Die meisten Numpy Funktionen haben Arrays als Ruckgabe
>>> zeros(10,int)
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
>>> ones(10,float)
array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
>>> sqrt(range(5))
array([0., 1., 1.41421356, 1.73205081, 2.])
Die Funktion array erzeugt ein Array aus der Eingabe
>>> array(range(5)) # Aehnlich wie : >>> float(5)
array([0, 1, 2, 3, 4]) # 5.
38 / 93
Arrays IV
Indizierung und Masken
Indizierung kann zum Filtern von Arrays verwendet werden
>>> a=arange(5)
>>> b=arange(0,5,2)
>>> a
array([0, 1, 2, 3, 4])
>>> b
array([0, 2, 4])
>>> a[b]
array([0, 2, 4])
39 / 93
Arrays IV
Indizierung und Masken
Die Boolsche Algebra kann auf Arrays angewendet werden
>>> a=arange(5)
>>> a
array([0, 1, 2, 3, 4])
>>> b=a>2
>>> b
array([False, False, False, True, True], dtype=bool)
>>> a[b] # Benutze b als Maske
array([3, 4])
>>> c=a<4 # Erstelle eine zweite Maske
>>> a[b*c] # Verbinde beide Masken mit
array([3]) # einem logischen Und
40 / 93
Ruckblick: Grunndlegende Konzepte III
Erinnerung: Aufgabe:
Schreibe eine Funktion, die in einer Liste alle Eintrage < -990 in 0 andert.[2.2, 3, 4.2, -999, 5] −→ [2.2, 3, 4.2, 0, 5]
Benutze eine for-Schleife, um auf die einzelnen Elemente zuzugreifen
z.B.: for i in range( len(liste) ):
Benutze liste[i], um an die einzelnen Eintrage der Liste zugelangen
def clean_data(liste):
for i in range(len(liste)):
if liste[i] < -990:
liste[i] = 0
41 / 93
Arrays IV
Aufgabe:
Schreibe eine Funktion, die in einem Array alle Eintrage < -990 in 0
andert.[2.2, 3, 4.2, -999, 5] −→ [2.2, 3, 4.2, 0, 5]
Erzeuge eine Maske, die alle Werte < -990 filtert
Benutze die Maske, um die Werte in 0 zu andern
def clean_data(data_array):
maske=data_array<-990 # Es geht auch kurz
data_array[maske]=0 # data_array[data_array<-990]=0
42 / 93
Arrays V
Mehrdimensionale Arrays
Bisher haben wir mit 1D Arrays gearbeitet
>>> a=ones(3)
>>> a
array([1., 1., 1.])
>>> a.shape # shape ist ein Attribut von Arrays
(3,) # a ist ein 1D Array der Laenge 3
>>> b=ones((3,3),int) # Achtung: Explizite Typisierung!
>>> b
array([[1, 1, 1],
[1, 1, 1],
[1, 1, 1]])
>>> b.shape
(3, 3) # b ist ein 2D Array der Dimension 3*3
43 / 93
Arrays V
1D Arrays sind wie Zeilenvektoren
a[2]=1.
a[1]=1.
a[0]=1.
a=ones(3)Zeile
0
1
2
44 / 93
Arrays V
2D Arrays sind wie Matrizen/Tabellen
a[2,1]=1.
a[1,1]=1.
a[0,1]=1.
a[2,0]=1.
a[1,0]=1.
a[0,0]=1.
a[2,2]=1.
a[1,2]=1.
a[0,2]=1.
SpalteZeile
0
1
2
a=ones((3,3))
0 1 2
45 / 93
Ruckblick: Grundlegende Konzepte I
Erinnerung: Datei Ein/Ausgabe: read
f = open("bsp1.txt", ’r’)
for line in f:
print line
f.close()
Ausprobieren!
Jede line wird als Text eingelesen. Wie kommen wir an die Zahlenwerte?
s = "10 15"
l = s.split() #-> l = ["10", 15"]
x = float(l[0]) #-> y = 10.0
y = float(l[1]) #-> x = 15.0
46 / 93
Numpy Datei Ein/Ausgabe
Eingabe: loadtxt
>>> data = loadtxt("bsp1.txt")
Die gesamte Datei wird auf einmal gelesen. Wie kommen wir an dieZahlenwerte?Ganz einfach ...
>>> x = data[:,0]
>>> y = data[:,1]
Und jetzt plotten wir x gegen y ...
>>> plot(x,y)
47 / 93
Ruckblick: Grundlegende Konzepte I
Erinnerung: Aufgabe:
Lies bsp1.txt ein, und speichere die Zahlen der beiden Spalten in denListen X, Y.
Wende .split() auf line an.
Wandel die Strings in float um.
Benutze .append() um die Werte an X,Y anzuhangen.
X = []
Y = []
f = open("bsp1.txt", ’r’)
for line in f:
l = line.split()
X.append(float(l[0]))
Y.append(float(l[1]))
f.close()
Hat sich erledigt!48 / 93
Numpy Datei Ein/Ausgabe
Ausgabe: savetxt
In aller Kurze ...
>>> savetxt(dateiname,data_array)
sollte es tun!
Aufgabe:
Schreibe mit Hilfe von savetxt die Zahlen 0-100 in die Dateiausgabesavetxt.txt.
>>> savetxt("ausgabesavetxt.txt",arange(101))
Schoner ist evtl.
>>> savetxt("ausgabesavetxt2.txt",arange(101),fmt="%i")
49 / 93
Histogramme
Was macht histogram
0 1 2 3Wir haben folgende Punkte : array([0.3,0.66,1.1,1.8,1.9,2.4])
0 1 2 3
Wir moechten wissen wie viele Punkte haben wir in den Intervallen?
0 - 1 1 - 2 2 - 3
0 1 2 3
Numpy histogram zaehlt fuer uns!
2 3 1
50 / 93
Histogramme
Wie verwendet man histogram
0 1 2 3Wir haben folgende Punkte : array([0.3,0.66,1.1,1.8,1.9,2.4])
0 1 2 3
Wir moechten wissen wie viele Punkte haben wir in den Intervallen?
0 - 1 1 - 2 2 - 3
0 1 2 3
Numpy histogram zaehlt fuer uns!
2 3 1
>>> points=array([0.3,0.66,1.1,1.8,1.9,2.4])
>>> histogr,intervals=histogram(points,arange(4))
>>> histogr
array([2, 3, 1])
>>> intervals
array([0, 1, 2, 3])
51 / 93
Vorbereitung auf Matplotlib
Aufgabe:
Wir bereiten uns nun auf den folgenden Teil, der sich intensiv mit derVisualisierung von Daten beschaftigen wird, vor. Die Dateiwetter kiel.txt enthalt Langzeitwetterdaten von der Wetterstation inKiel Holtenau. Ziel ist es mit Hilfe des bisher Gelernten einen Loader furdiesen Datensatz zu schreiben. Wenn die Daten geladen wurden solltenfolgende Arrays im Speicher sein
Zeit → Zeiten moglichst als datetime Objekte
LTemp → Luftemperatur
BTemp → Bodentemperatur
LDruck → Luftdruck
Regen → Regenmenge
Schnee → Schneemenge
Bedeckung → Wolkenbedeckung
52 / 93
Vorbereitung auf Matplotlib
Aufgabe:
Benutze loadtxt zum laden der Daten. Folgende Argumente sindhilfreich
usecols
skiprows
unpack
delimiter
Konvertieren der Zeiten mit :
import datetime
datetime.datetime.strptime(str(int(date)),"%Y%m%d"))
Wer mit dem Laden der Daten fertig ist, kann versuchen Histogramme ausden Daten zu erstellen und diese darzustellen.
hist aus pylab kann gleichzeitig histogrammieren und plotten
53 / 93
Matplotlib
Matplotlib is das Plotting-Interface zu den wissenschaftlichen Python-BibliothekenNumpy und Scipy.
Matplotlib bietet ...
einfache und verstandliche Syntax
eine unkomplizierte Einbindung in Python
(fast) grenzenlose Moglichkeit zur Darstellung von Daten
regelmaßige Funktions-Erweiterung dank steter Weiterentwicklung
eine umfangreiche Dokumentation inklusive hunderter Beispiel-Plots
Matplotlib bietet deswegen vor allem eins:
Spaß beim Arbeiten mit wissenschaftlichen Daten
54 / 93
Was uns erwartet ...
>>> import pylab
>>> DatenX, DatenY = lade_daten("./Daten/Wetter.dat")
>>> Ax = pylab.figure().gca()
>>> Ax.plot(DatenX, DatenY, lw = 2, label = "Wetter")
>>> Ax.set_ylabel("Temperatur")
>>> (...)
55 / 93
Erste Schritte in Matplotlib I
Der erste Plot:import pylab
# Erzeuge Daten
x = arange(10)
y = x**2
# Erzeuge Figur
Fig = pylab.figure()
# Erzeuge Achse
Ax = Fig.gca()
# Plotte Daten
Ax.plot(x, y)
56 / 93
Matplotlib - Hilfe
Hilfe in Python
Auflistung von Funktionen und Methoden
>>> import pylab
>>> Ax = pylab.figure().gca()
>>> Ax.<Tab>
<Funktionen des Ax Objektes>
>>> dir(Ax)
<Funktionen des Ax Objektes>
Hilfe zu Funktionen und Methoden
>>> Ax.plot? # nur iPython
<Docstring von Ax.plot>
>>> help(Ax.plot)
<Docstring von Ax.plot>
57 / 93
Matplotlib - Hilfe
Hilfe im Web
Dokumentation: http://www.matplotlib.org/contents
Beispiele: http://www.matplotlib.org/gallery
Figure : Snapshot der Matplotlib Gallery
58 / 93
Erste Schritte in Matplotlib I
Aufgabe:
Benutze die Hilfe um mehr uber den plot Befehl herauszufinden
Welche Argumente gibt es?
Wie kann man den Stil des Plots verandern?
>>> from numpy import linspace, sin, pi
>>> x = linspace(0,2*pi,100)
>>> P1, P2, P3 = sin(x), sin(0.5*x), sin(2*x)
Stelle P1, P2, P3 als Funktion von x dar. Benutze dafur Farben undStile vergleichbar zu dem nachfolgenden Plot:
59 / 93
Erste Schritte in Matplotlib I
Achsen Parameter I
Erstellung der Achse und Daten
Ax = pylab.figure().gca()
Ax.plot(arange(10), arange(10), label="Daten", marker="*")
Achsenbeschriftung
Ax.set_xlabel("X Label",fontsize=9)
Ax.set_ylabel("Y Label",color="red")
Achsenbereich
Ax.set_ylim(-2,8)
Ax.set_xlim(0,10)
60 / 93
Erste Schritte in Matplotlib I
61 / 93
Erste Schritte in Matplotlib I
Achsen Parameter II
Erzeugung einer sekundaren y-Achse
Ax2=Ax.twinx()
Ax2.plot(arange(10),1.5*arange(10),color="green")
Ax2.set_ylabel("Y2-Label",color="green")
Achsenmarkierung
Ax.set_xticks([2,4,6]) # Explizite x-Tick Markierung
Ax.set_minorticks_on() # Anschalten der Zwischen-Ticks
Ax.set_xticks([3,5,7],minor=True) # Explizite Zwischen-Ticks
Erzeugung eines Rasters
Ax.grid(which=’both’,axis=’both’)
62 / 93
Erste Schritte in Matplotlib I
Achsen Parameter II
Achsenlegende
Ax.legend()
63 / 93
Erste Schritte in Matplotlib I
Aufgabe I
Visualisiere den zeitlichen Verlauf der Temperatur und des Drucks derWetterstation Kiel Holtenau. Ihr konnt hierfur zum Einlesen derWetterdaten entweder euren eigenen oder den bereitgestellte Loader./aufgaben/wetter holtenau.py benutzen.Euer Endergebnis sollte in etwa wie folgt aussehen:
64 / 93
Erste Schritte in Matplotlib I
Aufgabe II (Optional)
Wer eine Herausforderung sucht, kann sich auch gerne an folgendem Plotversuchen, welcher mit dem Ax.scatter() Befehl erzeugt wurde.
Die Regenmenge wird durch die Große der Kreise dargestellt
Die Temperatur wird durch die Farbe der Kreise visualisiert
Die Menge an Schneefall wird durch die Quadratgroße bestimmt65 / 93
Matplotlib - Fortgeschrittene Funktionen
Matplotlib bietet eine große Zahl an weiterfuhrenden Plot Techniken.Durchstobert einfach die Beispiel Galleriehttp://www.matplotlib.org/gallery wenn ihr etwas bestimmtessucht. Hier werden wir die 3 gebrauchlichsten Techniken kurz vorstellen.
Isokonturlinien
>>> Ax.contour(*args)
Isokonturflachen
>>> Ax.contourf(*args)
Kontinuierliche Farbkonturen
>>> Ax.pcolormesh(*args)
66 / 93
Matplotlib - Fortgeschrittene Funktionen
Drei einfache Beispiele fur Isokonturlinien (links), Isokonturflachen (mitte)und einer Kombination aus einer Farbkontur und Isokonturlinien (rechts).
67 / 93
Einschub: 2D-Histogramme
Wenn wir folgende Punkte haben ...
0 1 2 30
1
2
3
68 / 93
Einschub: 2D-Histogramme
Und wissen mochten wieviele Punkte in den Quadraten liegen ...
0 1 2 30
1
2
3
69 / 93
Einschub: 2D-Histogramme
Konnen wir analog zu histogram, histogram2d verwenden.
0 1 2 30
1
2
3
1 1 0
1 0 0
0 2 1
70 / 93
Einschub: 2D-Histogramme
Wie verwendet man histogram2d?
0 1 2 30
1
2
3
1 1 0
1 0 0
0 2 1
>>> P_x=array([0.3,0.66,1.1,1.8,1.9,2.4])
>>> P_y=array([1.5,2.9,0.5,2.4,0.9,0.5])
>>> histogr,int_x,int_y=histogram2d(P_x,P_y,(arange(4),arange(4)))
>>> histogr
array([[ 0., 1., 1.],
[ 2., 0., 1.],
[ 1., 0., 0.]])
71 / 93
Matplotlib - Fortgeschrittene Techniken
Ein 2D-Histogramm kann z.B. mit pcolormesh dargestellt werden
0 1 2 30
1
2
3
1 1 0
1 0 0
0 2 1
0.0 0.5 1.0 1.5 2.0 2.5 3.00.0
0.5
1.0
1.5
2.0
2.5
3.0
0
1
2
Die folgenden Zeilen erzeugen den rechten Plot.
>>> fig=figure(figsize=(10.,10.))
>>> pcolormesh(int_x,int_y,histogr.T)
>>> colorbar(ticks=[0,1,2])
Keine Angst: Eine ausfuhrliche Erklarung folgt!72 / 93
Matplotlib - Fortgeschrittene Techniken
Um die Funktionsweisen von Ax.contour(*args), Ax.contourf(*args)und Ax.pcolormesh(*args) zu erlautern, werden wir zunachst einenzufallig generierten Datensatz erzeugen und diesen mittels desAx.pcolormesh(*args) Befehls darstellen.
Erzeugung eines zufallig generierten Datensatzes
xValues = append(normal(15, 2, size=1e6), \
normal(20, 5, size=1e6))
yValues = append(normal(10, 3, size=1e6), \
normal(15, 2, size=1e6))
Einordnen der Zufallszahlen in ein 2D Histogramm:
Histogram, xedges, yedges = histogram2d(xValues, yValues, \
bins = (arange(10,30,0.2), arange(0,20,0.2)))
73 / 93
Matplotlib - Ax.pcolormesh(*args)Bevor wir das 2D Histogramm plotten, einige Worte zur der allgemeinenSyntax von Ax.pcolormesh(*args)
Syntax - Pcolormesh
Ax.pcolormesh(X, Y, H, *args=vals)
Dabei stellen X und Y die Bin Kanten in x- und y-Richtung desHistogramms H dar. Dabei steht args fur optionale Argumente, die an diepcolormesh Methode ubergeben werden konnen.
Die gebrauchlichsten Argumente sind dabei:
cmap: Ubergabe einer spezifischen Colormap
vmin / vmax: unterer / oberer Grenzwert der pcolormeshDarstellung
alpha: Transparenz der Darstellung
Die Argument cmap und vmin, vmax werden wir spater noch genauerbeschreiben
74 / 93
Matplotlib - Ax.pcolormesh(*args)Der endgultige Plotbefehl fur unsere Zufallsdaten ist denkbar einfach.
Ax.pcolormesh(Xedges, Yedges, Histogram.T)
Figure : Der einfache pcolormesh Befehl 75 / 93
Matplotlib - Ax.pcolormesh(*args)Bevor es zu der ersten Ubung geht, gilt es eine Sache zu beachten:
Histogram2D in Kombination mit contour und contourf
Das erzeugte Histogramm mit histogram2d beinhaltet, wie ublichfur numpy arrays, in der 0-ten Dimension die x- und in der 1-tenDimension die y-Werte. pcolormesh, contour und contourf
benotigt jedoch ein umgekehrtes Format, d.h. um das Histogrammaus histogram2d zu nutzen, mussen wir das Histogrammtransponieren (x und y vertauschen).
Zusatzlich gibt histogram2d die Bin Kanten zuruck, wahrendcontour und contourf die Bin Position benotigen (gilt nicht furpcolormesh).
Ax.contourf(Xedges[:-1], Yedges[:-1], Histogram.T)
Ax.contour(Xedges[:-1], Yedges[:-1], Histogram.T)
Ax.pcolormesh(Xedges, Yedges, Histogram.T)
76 / 93
Matplotlib - Fortgeschrittene Techniken
Aufgabe:
Plotte durch Kombination des Ax.contour(*args) undAx.contourf(*args) Befehls unseren Zufallsdatensatz in folgenderDarstellung:
10 15 20 25X-Werte
0
5
10
15
Y-W
erte
100
100
200
400
800
Benutzt das Argumentlevels inAx.contour(*args)
Benutzt die MethodeAx.clabel(*arg)
Benutzt die gangigenMethoden fur dieAchsendarstellung
77 / 93
Matplotlib - ColorbarWir haben eben gelernt, wie wir mit Ax.clabel(*args) denIsokonturlinien eine Beschriftung zuweisen konnen. Jedoch hat dieFarbdarstellung von pcolormesh und contourf noch keinen Bezug zuden Intensitaten der Daten. Hierfur verwenden wir die Colorbar ausMatplotlib.
Erzeugung der - Colorbar
Figure = pylab.figure()
Ax = Figure.gca()
# Auswahl der vorgefertigten Colormaps aus Matplotlib
colormap = pylab.cm.get_cmap("jet")
# Erzeugung des Farbkontur mit der ausgewaehlten colormap
Mesh = Ax.pcolormesh([...], cmap=colormap)
# Erzeugung der Colorbar
colorbar = Figure.colorbar(Mesh)
# Setzen des Colorbar Beschriftung
colorbar.set_label("Intensity")
78 / 93
Matplotlib - ColorbarWir haben eben gelernt, wie wir mit Ax.clabel(*args) denIsokonturlinien eine Beschriftung zuweisen konnen. Jedoch hat dieFarbdarstellung von pcolormesh und contourf noch keinen Bezug zuden Intensitaten der Daten. Hierfur verwenden wir die Colorbar ausMatplotlib.
Figure : Eine typische Colorbar
79 / 93
Matplotlib - Colorbar
Syntax - Colorbar
Figure.colorbar(Mesh, *args=vals)
Dabei stellt Mesh das Objekt dar, welches von pcolormesh, contour undcontourf zuruckgegeben wird. Dabei steht args fur optionaleArgumente, die ubergeben werden konnen.
Die gebrauchlichsten Argumente sind dabei:
orientation: Orientierung der Colorbar
ax: Achse auf der die Colorbar dargestellt wird
ticks: Definitiert die Colorbar ticks
pad: Abstand der Colorbar zur Achse
80 / 93
Matplotlib - ColorbarNoch ein kleiner Hinweis zur Benutzung der colormap fur die Farbkontur-,Isokonturlinien- und Isokonturflachendarstellung
Syntax - Colormap
colormap = pylab.cm.get_cmap(arg)
arg steht dabei fur den Namen einer von vielen fertigen colormaps inmatplotlib. Eine vollstandige Liste der colormaps findest du unterhttp://wiki.scipy.org/Cookbook/Matplotlib/Show colormaps
Hinweis zum Ausblenden/Markieren von Daten
colormap.set_under("white")
colormap.set_over("green")
Ax.pcolormesh([...], vmin=5, vmax=10)
Dies wurde unabhangig von der gewahlten colormap alle IntensitatsWerte unter 5 bzw. uber 10 in weiß bzw. grun darstellen
81 / 93
Matplotlib - Fortgeschrittene Techniken
Aufgabe I
Stellt die globale Temperatur als Funktion des Langen- und Breitengradesmit Hilfe von Ax.pcolormesh(*arg) dar. Hier ist ein mogliches Beispielder Darstellung:
BenutztAx.pcolormesh(*args)
Verwendet die Colorbar
Benutzt google fur allesWeitere ;-)
82 / 93
Matplotlib - Fortgeschrittene Techniken
Aufgabe II (optional)
Stellt zusatzlich die Kustenlinien dar, welche in der Dateikuesten linien.dat definiert sind. Plottet zudem einige ausgewahlteStadte mit Namen in die Weltkarte.
Benutzt Ax.plot(*args)fur die Kustenlinien
und Stadte
Verwendet dieAx.set label(*arg) furdie Stadtenamen
Benutzt google fur allesWeitere ;-)
83 / 93
Matplotlib - Multipanel Plots
Bei komplexeren Datensatzen bietet es sich haufig an, mehrere Achsen aufeiner Grafik unterzubringen.=⇒ Multi-Achsen Plots (Multiplots)
Automatische Achsenerzeung
import pylab
Figure = pylab.Figure()
Ax = Figure.add_subplot(nr_x, nr_y, i)
Ax.plot(xdata, ydata)
nr x - Anzahl der Achsen in x-Richtung
nr y - Anzahl der Achsen in y-Richtung
i - Aktueller plot (1, ..., nr x*nr y)
0 1 2 3 4 5 6 7 8 90
10
20
30
40
50
60Plot 1
0 1 2 3 4 5 6 7 8 90
10
20
30
40
50
60Plot 2
0 1 2 3 4 5 6 7 8 90
10
20
30
40
50
60Plot 3
0 1 2 3 4 5 6 7 8 90
10
20
30
40
50
60Plot 4
0 1 2 3 4 5 6 7 8 90
10
20
30
40
50
60Plot 5
0 1 2 3 4 5 6 7 8 90
10
20
30
40
50
60Plot 6
nr_x = 2
nr_
y =
3
i=4
i=1 i=2
i=3
i=5 i=6
84 / 93
Matplotlib - Multipanel Plots
Automatische Achsenerzeung - Fine tuning#Setzt horizontalen und vertikalen Abstand = 0
pylab.subplots_adjust(hspace =0, wspace =0)
# Nebeneinander liegende Achsen teilen sich die y-Achse
Ax1 = Figure.add_subplot(1,2,1)
Ax2 = Figure.add_subplot(1,2,2, sharey=Ax1)
# Entferne y-Beschriftung von Ax2
Ax2_label = Ax2.get_yticklabels()
pylab.setp(Ax2_label, visible=False)
0.0 0.2 0.4 0.6 0.8 1.00.0
0.2
0.4
0.6
0.8
1.0
0.0 0.2 0.4 0.6 0.8 1.0
85 / 93
Matplotlib - Multipanel Plots
Aufgabe:
Erzeuge eine Figure die Sinus, Cosinus und Tangens in dreiubereinanderliegenden Achsen darstellt.Das Ergebnis sollte in etwa wie folgt aussehen:
1.0
0.5
0.0
0.5
1.0
sin(
x)
1.0
0.5
0.0
0.5
1.0
cos(
x)
0 2 4 6 8 10x
10
5
0
5
10
tan(
x)
86 / 93
Matplotlib - Multipanel Plots
Achsenerzeugung von Handimport pylab
Figure = pylab.figure()
Ax1 = pylab.axes([0.1, 0.1, 0.8, 0.8])
# Erzeugung der ersten Achse [x-pos, y-pos, breite, hoehe]
Ax2 = pylab.axes([0.2, 0.2, 0.3, 0.3])
# Erzeugung der zweiten Achse
Ax1.plot( sin(arange(0, 2*pi, 0.01)))
Ax2.plot( cos(arange(0, 2*pi, 0.01)))
0 100 200 300 400 500 600 7001.0
0.5
0.0
0.5
1.0
0 100 200 300 400 500 600 7001.0
0.5
0.0
0.5
1.0
0.1
0.1
0.8
0.8
0.20.2
0.3
0.3
87 / 93
Matplotlib - Letzte Anmerkungen
Globale Einstellungen
Bei umfangreicheren Plot ist es oftmals hilfreich die Standardeinstellungenvon pylab zu andern. Hierzu verwendet man rcParams aus matplotlib:
from matplotlib import rcParams
rcParams[’font.size’] = 20
Die Standardschriftgroße (12) wird auf 20 gesetzt.
rcParams[’lines.linewidth’] = 3
Die Standardliniendicke (1) wird auf 3 gesetzt.
Speichern von Plots
Naturlich ist es auch moglich einen Plot direkt und mit den gewunschtenParametern zu speichern.
Figure.savefig("Bildname.pdf", *arg)
Genug mit neuen Informationen, kommen wir zur letzten Aufgabe!88 / 93
Matplotlib - Multipanel Plots
Aufgabe:
Erstelle den folgenden Plot:
89 / 93
Ausblick und Zusammenfassung
Ihr habt bereits viele Dinge kennengelernt, die euch den Umgang mit derProgrammiersprache Python als wissenschaftliches Werkzeug erleichternwerden.
Funktionsweise und Moglichkeiten von Python
Umgang mit numpy, wie liest man Dateien effizient ein
Einfache Plot Techniken wie Ax.plot(*arg) undAx.scatter(*arg)
Fortgeschrittene Plot Techniken wie Ax.contour(*arg) undAx.pcolormesh(*arg)
Nutzt unsere Musterlosungen und Handouts gerne als ”Startpunkt” fureure eigene Arbeit!
Aber ...
Man lernt niemals aus!
90 / 93
Ausblick und Zusammenfassung
Figure : Pie Charts! [1] Figure : 3D Plots! [1]
[1] Aus http://www.matplotlib.org/gallery
91 / 93
Ausblick und Zusammenfassung
Figure : Vektorfelder! [1] Figure : Interaktive Animation! [2]
[1] Aus http://www.matplotlib.org/gallery
[2] Aus eigener Forschung
92 / 93
Ausblick und Zusammenfassung
Wenn ihr noch Fragen zu Python, numpy oder matplotlib habt, wendeteuch gerne an uns
Die Musterlosungen, Handouts und Vorlesungsfolien findet ihr unter:
http://www.ieap.uni-kiel.de/et/people/koehler/PyKurs
93 / 93