Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen...

93
Ein gutes Bild sagt mehr als tausend Worte Datenverarbeitung und Visualisierung mit Python Jan K¨ ohler Lars Berger Christian Drews 7.-8. April 2014 1 / 93

Transcript of Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen...

Page 1: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

Ein gutes Bild sagt mehr als tausend WorteDatenverarbeitung und Visualisierung mit Python

Jan Kohler Lars Berger Christian Drews

7.-8. April 2014

1 / 93

Page 2: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

Ubersicht

Warum Python?

Erste Schritte in Python

numpy/scipy

matplotlib

2 / 93

Page 3: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 4: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 5: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 6: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

Die Spyder Konsole... bereitet alles zum interaktiven Arbeiten vor:

6 / 93

Page 7: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 8: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 9: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 10: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 11: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 12: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 13: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 14: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 15: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 16: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 17: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 18: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 19: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 20: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 21: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 22: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 23: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 24: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 25: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 26: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 27: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 28: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 29: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 30: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 31: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 32: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 33: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 34: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 35: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 36: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 37: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 38: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 39: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 40: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 41: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 42: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 43: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 44: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 45: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 46: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 47: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 48: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 49: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 50: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 51: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 52: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 53: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 54: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 55: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 56: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 57: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 58: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

Matplotlib - Hilfe

Hilfe im Web

Dokumentation: http://www.matplotlib.org/contents

Beispiele: http://www.matplotlib.org/gallery

Figure : Snapshot der Matplotlib Gallery

58 / 93

Page 59: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 60: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 61: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

Erste Schritte in Matplotlib I

61 / 93

Page 62: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 63: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

Erste Schritte in Matplotlib I

Achsen Parameter II

Achsenlegende

Ax.legend()

63 / 93

Page 64: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 65: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 66: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 67: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

Matplotlib - Fortgeschrittene Funktionen

Drei einfache Beispiele fur Isokonturlinien (links), Isokonturflachen (mitte)und einer Kombination aus einer Farbkontur und Isokonturlinien (rechts).

67 / 93

Page 68: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

Einschub: 2D-Histogramme

Wenn wir folgende Punkte haben ...

0 1 2 30

1

2

3

68 / 93

Page 69: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

Einschub: 2D-Histogramme

Und wissen mochten wieviele Punkte in den Quadraten liegen ...

0 1 2 30

1

2

3

69 / 93

Page 70: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 71: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 72: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 73: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 74: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 75: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 76: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 77: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 78: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 79: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 80: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 81: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 82: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 83: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 84: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 85: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 86: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 87: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 88: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 89: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

Matplotlib - Multipanel Plots

Aufgabe:

Erstelle den folgenden Plot:

89 / 93

Page 90: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

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

Page 91: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

Ausblick und Zusammenfassung

Figure : Pie Charts! [1] Figure : 3D Plots! [1]

[1] Aus http://www.matplotlib.org/gallery

91 / 93

Page 92: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

Ausblick und Zusammenfassung

Figure : Vektorfelder! [1] Figure : Interaktive Animation! [2]

[1] Aus http://www.matplotlib.org/gallery

[2] Aus eigener Forschung

92 / 93

Page 93: Ein gutes Bild sagt mehr als tausend Worte - ieap.uni-kiel.de · pyqt - Gra sche Benutzerober achen (Qt) numpy/scipy - Paket zum wissenschaftlichen Programmieren in Python matplotlib

Ausblick und Zusammenfassung

Wenn ihr noch Fragen zu Python, numpy oder matplotlib habt, wendeteuch gerne an uns

<[email protected]>

<[email protected]>

<[email protected]>

Die Musterlosungen, Handouts und Vorlesungsfolien findet ihr unter:

http://www.ieap.uni-kiel.de/et/people/koehler/PyKurs

93 / 93