Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Martin G. Schultz Beginn mit Studentenvortrag 1 aus Teil 1

Ähnliche Präsentationen


Präsentation zum Thema: "Martin G. Schultz Beginn mit Studentenvortrag 1 aus Teil 1"—  Präsentation transkript:

1 Wissenschaftliche Programmierung mit Python - für Meteorologie und Atmosphärenforschung
Martin G. Schultz Beginn mit Studentenvortrag 1 aus Teil 1 Teil 6: Plotting, Part 2

2 Andere Plots, 2D Darstellungen, Karten

3 1. Box and whisker plots Aus der Matplotlib.axes Dokumentation:
Mehrere Datenreihen können als Liste von Listen (bzw. numpy arrays) übergeben werden Beispiel für einfachen Boxplot:

4 Gestaltung des Boxplots
Boxplot liefert ein dictionary zurück, in dem folgende Informationen gespeichert sind: medians: Liste von Line2D Objekten fliers: Liste von Line2D Objekten whiskers: Liste von Line2D Objekten boxes: Liste von Line2D Objekten (patch_artist=False) oder PathPatch Objekten (patch_artist=True) caps: Liste von Line2D Objekten Um dann z.B. die Box-Füllfarbe zu ändern muss man über die einzelnen Lines oder Patches iterieren (oder die plt.setp() Methode verwenden):

5 Box-/Whiskerplot Anwendungsbeispiel Modulimport: keine unbekannten
Als erstes kümmern wir uns wieder um das Einlesen der Daten. Wie gehabt werden wir csv2rec benutzen. Zuvor definieren wir allerdings zwei Funktionen, die die Datenreihen in monatliche Abschnitte zerlegen: für die Indizes brauchen wir nur die Datumswerte Wir legen eine Liste von Listen an Code adapted from Der jeweilige Ausschnitt der Daten wird als numpy array in der Liste abgelegt.

6 Box-/Whiskerplot Nun erfolgt das Einlesen der Daten
Ermitteln der Indizes Einsortieren der Daten Code adapted from

7 Box-/Whiskerplot Hier kommt der Hauptteil der Plotarbeit
Das Definieren spezieller Unterroutinen macht den Code lesbarer Code adapted from Auch diese Anweisungen könnte man in Unterroutinen „verstecken“…

8 Box-/Whiskerplot Die Details der Formatierung
Im Beispielprogramm sind diese Funktionen im Kopfteil definiert Hier wird das dictionary übergeben, welches boxplot zurückliefert Code adapted from

9 Box-/Whiskerplot Weiter geht‘s im Hauptprogramm
Hier werden einzelne ticklabels unsichtbar gemacht Code adapted from

10 Box-/Whiskerplot Nun noch die Legende
Wir benutzen eine axes.legend statt einer figure.legend, damit die Legende mittig unter dem Plot selbst ist! Und zum Schluss speichern und anzeigen Code adapted from

11 Box-/Whiskerplot Ergebnis

12 Karten und Vertikalschnitte
Bei der Auswertung von Simulationen mit meteorologischen oder Erdsystemmodellen werden oftmals Kartendarstellungen oder vertikale Schnitte benötigt. Python stellt für Karten die Basemap Ergänzung zu matplotlib bereit. Im Zuge der Darstellung vertikaler Schnitte werden wir uns auch mit (einfacher) Interpolation befassen. Zum Üben benutzen wir die Datei MACC_ _0001.nc (zu finden unter ftp://sv02.meteo.uni-bonn.de/pub/maschu/python/data/ MACC_ _0001.nc), der übrigens mit dem auf Python und javascript basierenden Web-Interface (demnächst erzeugt wurde.

13 Aufwärmen: netcdf Dateien
Schauen wir uns erst einmal an, was in der netcdf Datei enthalten ist: Wir erhalten einen Überblick über die Variablennamen, deren Typ, den Dimensionen und den Metadaten-Attributen. Beispiel: Hier steht der Variablenname

14 Aufgaben Lese den ersten und den letzten Zeitschritt der Variablen vmr_ch2o aus der Datei MACC_ _0001.nc ein und speichere diese Daten in der Variable ch2o. Nun lese das dritte „level“ derselben Variablen für alle Zeitschritte ein. Wie erfährst du, welche Dimensionen deine Daten dann haben? Informationen über die Vertikalkoordinate sind in den Variablen lev, bzw. in a, b und ps gespeichert. Welches level ist das „surface level“? Lese jeweils das unterste level für die Variablen vmr_ch2o und vmr_o3 am 9. Zeitschritt aus. (*) Wie könntest du dir eine Zeitreihe der vmr_o3 Daten im untersten level für die Koordinaten lon=7.0667, lat= extrahieren? 1.) ch2o=f.variables['vmr_ch2o'][0,:,:,:]; ch2o=f.variables['vmr_ch2o'][-1,:,:,:] 2.) ch2o=f.variables['vmr_ch2o'][:,2,:,:]; ch2o.shape 3.) das erste level ist das surface level. „lev“ gibt nominelle sigma Werte an, der erste ist 0.998… Den aktuellen Druck einer Schicht kann man mit p[k] = a[k]*p0 + b[k]*ps ausrechnen. ch2o=f.variables['vmr_ch2o'][8,0,:,:] o3=f.variables['vmr_o3'][8,0,:,:] 4.) nearest = lambda a,v: np.abs(a-v).argmin() ilon = nearest(lon,7.0667) ilat = nearest(lat, ) print ilon,ilat o3=f.variables['vmr_o3'][:,0,ilat,ilon]

15 Kartenprojektionen Das Basemap Modul stellt diverse Projektionen zur Verfügung. Beispiele sind:

16 Kartenprojektionen Für jede Projektion gibt es verschiedene Optionen. Dokumentation unter Beispiel: m (die Instanz des Basemap Objektes) enthält alle benötigten Informationen zur Koordinatentransformation und zum Zeichnen von Kontinenten, etc. Viele der Zeichenroutinen von matplotlib (z.B. contour, contourf) werden von Basemap dupliziert und ggf. durch Koordinatentransformationen ergänzt.

17 Zeichnen von Kontinenten etc.
Variante 1: Zeichnen von Vektordaten Verfügbare Auflösungen*: c(oarse), l(ow), i(ntermediate), h(igh), f(ull) * muss bereits bei der Definition der Projektion angegeben werden Beispiel:

18 Zeichnen von Kontinenten etc.

19 Zeichnen von Kontinenten etc.
Variante 2: Pixelgrafik als Hintergrund bluemarble shadedrelief etopo

20 Zeichnen von Kontinenten etc.
Hier der Sourcecode zu den letzten Beispielen: warpimage kann ein beliebiges Bild über die Erde legen, sofern das Bild globale Abdeckung hat, ein regelmäßiges Längen- und Breitengitter aufweist, und bei -180 und -90 beginnt. Der Dateiname kann auch eine URL sein (s.o.).

21 Eigene Daten auf eine Karte zeichnen
Basemap stellt folgende Plotroutinen bereit, die größtenteils an matplotlib „weitergereicht“ werden. Man kann genauso gut mit plt.*** plotten; manchmal ist jedoch das Koordinatenhandling einfacher, wenn die Basemap-Version benutzt wird. barbs(x, y, u, v, *args, **kwargs) contour(x, y, data, *args, **kwargs) contourf(x, y, data, *args, **kwargs) hexbin(x, y, **kwargs) imshow(*args, **kwargs) pcolor(x, y, data, *args, **kwargs) pcolormesh(x, y, data, *args, **kwargs) plot(*args, **kwargs) quiver(x, y, u, v, *args, **kwargs) scatter(*args, **kwargs) streamplot(x, y, u, v, *args, **kwargs) zusätzliches keyword: latlon=False Wird latlon auf True gesetzt, werden x und y als longitude und latitude interpretiert (sonst Projektionskoordinaten)

22 Ein erster Versuch: Contour
Code aus map_demo_v01.py

23 Das Ergebnis… map_demo_v01.py Problem: die longitude Daten belegen den Wertebereich Grad, die Kartenprojektion verlangt aber Grad.

24 Nutze Basemap Routinen für die Koordinatentransformation
Code aus map_demo_v02.py

25 Das Ergebnis… map_demo_v02.py Noch nicht so schön: Konturlinien zeigen kaum Farbkontrast. Problem: Werte sind „logarithmisch“, Konturskalierung linear

26 Nutze Basemap Routinen für die Koordinatentransformation
Code aus map_demo_v02.py Das norm keyword legt die Umrechnung der Werte in den Zahlenbereich 0..1 fest. Folgende Normen stehen zur Auswahl: NoNorm Normalize LogNorm

27 Das Ergebnis… … vielleicht doch lieber gefüllte Konturlinien?
map_demo_v03.py … vielleicht doch lieber gefüllte Konturlinien?

28 Bei gefüllten Konturplots ist zorder nützlich
Code aus map_demo_v04.py Das norm keyword legt die Umrechnung der Werte in den Zahlenbereich 0..1 fest. Folgende Normen stehen zur Auswahl: NoNorm Normalize LogNorm

29 Das Ergebnis… ohne zorder zorder = 3
map_demo_v04.py ohne zorder zorder = 3 Kommt dem gewünschten Ergebnis doch schon ziemlich nahe…

30 Feinkontrolle des Farbbalkens
Code aus map_demo_v05.py Benutze einen LogFormatter, um alle Werte am colorbar anzuzeigen. U.U. kann man auch noch das ticks keyword der colorbar Methode verwenden. Anmerkung: colorbars können auch mit „extend= min|max|both“ erweitert werden. Allerdings klappt dies zurzeit nicht mit logarithmischen Werten.

31 Das Ergebnis… map_demo_v05.py

32 Mehr Karten… siehe

33 Vertikalschnitte Vertikale Schnitte durch Modellfelder sind nützlich, um z.B. Austauschprozesse besser zu verstehen, oder um einen schnellen Überblick über die globale Verteilung von Variablen (Temperatur, Spurengaskonzentrationen etc.) zu bekommen. Wir beginnen mit dem (gewünschten) Ergebnis und erläutern dann schrittweise den hierfür erstellten Code. Dieser enthält eine Menge an matplotlib Kniffen und mag daher als Fundgrube zur Lösung eigener Probleme dienen.

34 Vertical Cross Sections
Code zur Erzeugung von Vertikalschnitten Beginnen wir mit dem Hauptprogramm. Es besteht im Wesentlichen aus zwei Funktionsaufrufen: getZMData zum Einlesen der Daten (aus einer netCDF Datei), und plotZM zur Darstellung des Vertikalschnitts. Zuvor wird der Dateiname spezifiziert und dazwischen wird ein Dictionary mit diversen Plot-Optionen definiert. Der Code funktioniert auch ohne Übergabe des plotOpt dictionaries, allerdings sieht der Plot dann nicht so schön aus. Man beachte: während die getZMData Routine dafür ausgelegt ist, zonale Mittelwerte zurückzugeben (also Mittelwerte über alle longitudes), kann plotZM auch zur Anzeige einzelner Schnitte (allerdings immer mit Latitude als x Achse) benutzt werden. Die surfacePressure Option ist vor allem für diesen Fall vorgesehen. Code adapted from

35 Vertical Cross Sections
Modulimport und Einlesen der Daten ACHTUNG: Modell-abhängig! Bedingte Indizierung Code adapted from

36 Vertical Cross Sections
Darstellung des Zonalschnittes Code adapted from Es kann gar nicht oft genug betont werden, wie wichtig eine gute (aber nicht zu ausführliche) Dokumentation ist!

37 Vertical Cross Sections
Wir beginnen mit ein paar Basisdingen: setze plotOpt auf ein leeres dictionary, falls keine Optionen übergeben wurden (das erlaubt den Zugriff auf Elemente via get-Methode) definiere Konstanten (hier nur labelFontSize) erzeuge eine figure und das erste Koordinatensystem (ax1), in welches geplottet wird skaliere die Daten (lege eine Kopie an, damit die Ursprungsdaten nicht überschrieben werden) Code adapted from

38 Vertical Cross Sections
Das war schon der Hauptteil des eigentlichen Konturplots. Beachte folgendes: das Auslesen der Kontur-Intervalle aus plotOpt erfolgt mit der get-Methode. Wurde in plotOpt kein levels key definiert, wird der Default (20 linear ansteigende Intervalle zwischen min und max) benutzt. die Kontur-Intervalle müssen „vernünftig“ den Farben der Farbtabelle zugeordnet werden. Dies geschieht hier mit der BoundaryNorm, die am flexibelsten ist. die fill_between Methode wird benutzt, um die Region unterhalb des Bodendrucks auszublenden dem colorbar wird ein label hinzugefügt und die tick labels des colorbars werden auf die definierte Fontgröße gesetzt Code adapted from

39 Vertical Cross Sections
Die Formatierung der linken y Achse ist noch relativ einfach. Wir benutzen einen LogLocator, um die tick labels festzulegen und verwenden dabei das subs keyword, um eine feinere Einteilung als Dekaden zu bekommen. Je nach Wertebereich (siehe topLevel keyword bei getZMData) werden mal mehr, mal weniger subs eingefügt. Als Zahlenformatierung der pressure tick labels wählen wir %g. Dies schaltet automatisch auf Exponentialdarstellung um, wenn die Werte zu groß oder zu klein werden. Code adapted from

40 Vertical Cross Sections
Nun beginnen wir mit der rechten Seite. Hier wollen wir optional ein kleines Nebenpanel anlegen, welches die Modellschichten anzeigt, falls das modelLevels keyword eien Liste von Druckwerten enthält. Dementsprechend werden die altitude tick labels entweder an der zweiten y Achse des Hauptplots (ax2), oder an dem Zusatzplot (axm) angezeigt. Zunächst berechnen wir jedoch die Höhen der Modelschichten aus den Druckwerten und erzeugen eine Zwillingsachse (ax2). Sodann folgt ein bisschen Formatierung der x Achsenticks (Latitude). Beachte, dass hier ax1.xaxis… stehen muss und diese Anweisungen nach dem twinx() Befehl auftauchen sollten – ansonsten geht es womöglich schief. Code adapted from

41 Vertical Cross Sections
Zur Verschiebung der Achsenbeschriftung Hier erfolgt nun das Zeichnen der horizontalen Linien für die Modellschichten, falls gewünscht. Mittels fig.add_axes erzeugen wir ein weiteres Achsensystem, welches über sharey mit der (rechten) y Achse unseres Hauptsystems verbunden ist. Dadurch kann man den Plot später interaktiv zoomen und verschieben und der Konturplot ändert sich synchron mit der Anzeige der Modellschichten. Wenn wir das Zusatzpanel anzeigen, schalten wir dessen x Achse auf unsichtbar und löschen die tick labels des ax2 Koordinatensystems. Die Ticklinien bleiben jedoch stehen (deshalb nicht einfach ax2.yaxis.set_visible(False)). Code adapted from

42 Vertical Cross Sections
Schließlich verwenden wir den soeben definierten Alias für die rechte Achse (axr), um die Formatierung der „Altitude“ Achse festzulegen: mit dem MaxNLocator erzeugen wir im Allgemeinen sinnvoll gestaffelte tick labels yaxis.tick_right() zwingt die tick labels auf die rechte Seite (das wäre zwar bei ax2 der default, bei axm aber nicht) Auch bei der rechten Achse werden die tick labels wieder auf die gewünschte Fontgröße gesetzt Der vollständige Code steht unter ftp://sv02.meteo.uni-bonn.de/pub/maschu/python/codes/plot_vertical_cross_section.py Code adapted from

43 THE END Weitere Themen für die Zukunft: Interpolation Farb-Management
Grafische Benutzeroberflächen Wissenschaftliche Datenauswertung

44 Bonus-Material Wenigstens ein bisschen was zur Interpolation – ohne große Worte…


Herunterladen ppt "Martin G. Schultz Beginn mit Studentenvortrag 1 aus Teil 1"

Ähnliche Präsentationen


Google-Anzeigen