Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

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

Ähnliche Präsentationen


Präsentation zum Thema: "Wissenschaftliche Programmierung mit Python - für Meteorologie und Atmosphärenforschung Martin G. Schultz Teil 6: Plotting, Part 2."—  Präsentation transkript:

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

2 ANDERE PLOTS, 2D DARSTELLUNGEN, KARTEN 2

3 1. Box and whisker plots 3 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 4 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 5 Box-/Whiskerplot 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 Anwendungsbeispiel Modulimport: keine unbekannten Wir legen eine Liste von Listen an Der jeweilige Ausschnitt der Daten wird als numpy array in der Liste abgelegt.

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

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

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

9 9 Box-/Whiskerplot Weiter gehts im Hauptprogramm Hier werden einzelne ticklabels unsichtbar gemacht

10 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

11 11 Ergebnis Box-/Whiskerplot

12 Karten und Vertikalschnitte 12 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 juelich.de:50080 (demnächst ) erzeugt wurde. ftp://sv02.meteo.uni-bonn.de/pub/maschu/python/data/ MACC_ _0001.nc juelich.de:50080

13 Aufwärmen: netcdf Dateien 13 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 1.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. 2.Nun lese das dritte level derselben Variablen für alle Zeitschritte ein. Wie erfährst du, welche Dimensionen deine Daten dann haben? 3.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. 4.(*) Wie könntest du dir eine Zeitreihe der vmr_o3 Daten im untersten level für die Koordinaten lon=7.0667, lat= extrahieren?

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

16 Kartenprojektionen 16 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. 17 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. 18

19 Zeichnen von Kontinenten etc. 19 Variante 2: Pixelgrafik als Hintergrund bluemarbleshadedreliefetopo

20 Zeichnen von Kontinenten etc. 20 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 21 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 22 Code aus map_demo_v01.py

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

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

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

26 Nutze Basemap Routinen für die Koordinatentransformation 26 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… 27 … vielleicht doch lieber gefüllte Konturlinien? map_demo_v03.py

28 Bei gefüllten Konturplots ist zorder nützlich 28 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… 29 Kommt dem gewünschten Ergebnis doch schon ziemlich nahe… map_demo_v04.py ohne zorder zorder = 3

30 Feinkontrolle des Farbbalkens 30 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… 31 map_demo_v05.py

32 Mehr Karten… 32 siehe

33 Vertikalschnitte 33 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 34 Vertical Cross Sections 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. Code zur Erzeugung von Vertikalschnitten 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.

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

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

37 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)

38 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

39 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.

40 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.

41 41 Vertical Cross Sections 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)). Zur Verschiebung der Achsenbeschriftung

42 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.pyftp://sv02.meteo.uni- bonn.de/pub/maschu/python/codes/plot_vertical_cross_section.py

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

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


Herunterladen ppt "Wissenschaftliche Programmierung mit Python - für Meteorologie und Atmosphärenforschung Martin G. Schultz Teil 6: Plotting, Part 2."

Ähnliche Präsentationen


Google-Anzeigen