Wissenschaftliche Programmierung mit Python - für Meteorologie und Atmosphärenforschung Martin G. Schultz Beginn mit Studentenvortrag 1 aus Teil 1 Teil 5: Plotting, Part 1
Python Grafik Module Matplotlib: quasi Standard, sehr umfangreich, hohe Qualität, Einbindung in GUIs, starke Entwicklergemeide, … pyngl: NCAR graphics language; spezialisiert auf “Atmosphärenplots”, leistungsstark, aber nicht immer ganz fehlerfrei, kleine Gruppe von Entwicklern pygooglechart: Interface zu googlechart PyGrADS: Interface zu GrADS (2008) gnuplot.py: Interface zu gnuplot (2008) Mayavi: 3D plotting package (Enthought) Andere: PyQwt, biggles, gasp
Matplotlib Einfache Bedienung ähnlich MATLAB mit dem pyplot Modul oder ipython Vollständige Kontrolle aller grafischen Elemente via objektorientiertem Ansatz Setzt numpy voraus Erweiterung basemap zur Kartendarstellung Erweiterung mplot3d für 3D Plots (alpha-Status) Sehr hilfreich: Matplotlib Gallery http://matplotlib.org/gallery.html (Klick auf den Plot zeigt den zugehörigen Quellcode an) Eine sehr gute Übersicht über die wesentlichen Dinge findet sich auf http://www.loria.fr/~rougier/teaching/matplotlib/. Für Details siehe auch http://matplotlib.org/api/pyplot_api.html.
Matplotlib Konzept scripting layer artist layer backend layer Pyplot Figure artist layer Axes Line2D XAxis YAxis Text … x-label x-ticks … draw FigureCanvas Renderer: z.B. Agg (anti grain geometry), ein schneller pixel renderer in C++, der auch für png output verwendet wird. „FigureCanvas is the paper, the renderer puts ink on the paper. Artists know how to use the paintbrush to put ink on the paper.“ Primitive artists: Line2D, Text, Rectangle, Circle Composite artists (=collections): Figure, Axes, Axis, Ticks Axes most important – defines most Matplotlib API methods (hist, plot, bar, …) backend layer Renderer Event based on article http://www.aosabook.org/en/matplotlib.html
Figure, Axes, etc. (y)axis axes.title figure figure.text Text: xi n axes (subplot) (x)axis.major_ticks (x)axis.majorticklabels
Matplotlib Koordinatensysteme matplotlib spends a lot of time transforming coordinates from one system to another. These coordinate systems include: data: the original raw data values axes: the space defined by a particular axes rectangle figure: the space containing the entire figure display: the physical coordinates used in the output (e.g. points in PostScript, pixels in PNG) from http://www.aosabook.org/en/matplotlib.html
Matplotlib API demo Histogram plot -- Vorbereitung Version 1: Pyplot (MATLAB ähnliche Kommandosprache) Version 2: Nutzung von Artists und FigureCanvas Beide Formen können gemischt werden: man kann mit plt.gcf() die aktuelle Figure Instanz bekommen und mit plt.gca() die aktuelle Axes Instanz. plt.plot gibt eine Liste von Line2D Objekten zurück; plt.hist gibt ein Tupel (n, bins, patches) zurück.
Pyplot: 1-dimensionale Daten Method Function errorbar Kurve mit Fehlerbalken loglog, semilogx, semilogy Plot mit logarithmischen Achsen plot zeichne Linien und/oder Symbole plot_date zeichne Kurven mit Datums (x) Achse plotfile Lese Daten aus Datei und plotte polar Polarplot scatter x,y Scatterplot step Stufenplot errorbar bzw. plot: errorbar kann imme rnur eine Kurve zeichnen, plot auch mehrere gleichzeitig errorbar plot_date polar scatter
Pyplot: 2-dimensionale Daten Method Function barbs Windsymbole (Richtung und Geschwindigkeit) contour, contourf Konturplot (clabel für Beschriftung) mit Linien bzw. gefüllt hexbin „hexagon binning plot „ hist2d 2D Histogramm (ähnlich hexbin) pcolormesh Farbgitter-Plot (auch pcolor) quiver 2D Feld von Pfeilen (z.B. Windvektoren) streamlines Strömungslinien tricontour, tricontourf Konturplot mit Triangulation (Linien bzw. gefüllt) tripcolor Farbfeld mit Triangulation triplot Gitterplot mit Triangulation errorbar bzw. plot: errorbar kann imme rnur eine Kurve zeichnen, plot auch mehrere gleichzeitig Ausgelassen: matshow over pause spy subplot2grid subplot_tool subplots_adjust switch_backend (experimental) table tight_layout (für subplot) waitforbuttonpress hist2d barbs contour tricontourf streamlines triplot hexbin
Der Plot-Befehl und Plot-Optionen Darstellung von Zeitreihen Der Plot-Befehl und Plot-Optionen
plt.plot – hatten wir schon mal… siehe PythonWiss01_introduction
Der plt.plot Befehl Ein Text für die Legende. y-Werte: meist ein numpy array. x-Werte: meist ein numpy array. Wird nur ein Argument angegeben, dann stehen hier die y-Werte und x wird von 0 bis len(y) gezählt. Farbe und Plotsymbol („marker“). Statt dieser Kurzform kann auch marker=„x“ und markerfacecolor=„r“ angegeben werden. Weiter kann eine Verbindungslinie spezifiziert werden (z.B. ′-′).
Der plt.plot Befehl vollständig (1) Das kann sehr nützlich sein, um die Linieneigenschaften nachträglich zu ändern!
Plot line and marker symbols lines Keyword arguments: alpha = 0..1 (opaqueness) linestyle = -, None linewidth = 3. marker = * , None markeredgecolor = k|r|g|b|c|m|y|w|#ffc000 , None markeredgewidth = 2. markerfacecolor = k|r|g|b|c|m|y|w|#ffc000 , None markersize = 8. for more options, see http://matplotlib.org/api/pyplot_api.html
plt.plot Keywords (1) * Beispiel folgt (Info: diese Keywords entsprechen line2D Eigenschaften) Keyword Beschreibung *alpha Transparenz-1 (0 = transparent, 1 = opak) animated {True, False} See http://www.scipy.org/Cookbook/ Matplotlib/Animations *antialiased axes Referenz zum Koordinatensystem (siehe OO-Plotting) *clip_box Clip (Abschneiden) am Rand einer gegebenen Bounding Box *clip_on Clip (Abschneiden) am Achsenrand {True, False} clip_path {[ (Path, Transform) | Patch | None ]} See http://matplotlib.org/examples/api/ clippath_demo.html *color Farbe (der Linie) contains Für Event-Handling {callable function} See http://matplotlib.org/users/artists.html Keyword Beschreibung *dash_ capstyle {″butt″, ″round″, ″projecting″} dash_ joinstyle {″miter″, ″round″, ″bevel″} Kein sichtbarer Effekt(?) *dashes {sequence of on/off ink in points} *drawstyle {″default″, ″steps″, ″steps-pre″, ″steps-mid″, ″steps-post″} figure Referenz zum „Panel“ (siehe OO-Plotting) *fillstyle Füllung der Symbole {″full″, ″bottom″, ″left″, ″right″, ″top″, ″none″} gid {an id string} irgendeine kryptische Bedeutung… label Bezeichnung der Kurve (siehe legend() ) *linestyle Linienart {″-″, ″--″, ″-.″, ″:″, ″None″, ″ ″, ″″ or same with prepended drawstyle ″steps--″} *linewidth Stärke der Linie in Punkten {float} fillstyle = „none“ funktioniert nicht (python 2.7) – benutze stattdessen markerfacecolor=„none“ ! … (siehe http://matplotlib.org/api/pyplot_api.html)
plt.plot Keywords (2) Keyword Beschreibung lod „Level of detail“ {True, False} marker Markierungssymbol (siehe unten) marker edgecolor Farbe des Symbol-Umrisses (siehe unten) marker edgewidth Linienstärke des Symbolumrisses {float} *marker facecolor Füllfarbe des Symbols (siehe unten) *marker facecoloralt Zweite Füllfarbe des Symbols bei fillstyle== ″bottom″, ″left″, ″right″, ″top″ (siehe unten) *markersize Symbolgröße {float} markevery {None | integer | (startind, stride)} picker {float distance in points or callable pick function fn(artist, event)} pickradius {float distance in points} Keyword Beschreibung rasterized Zeichne Element als Pixelgrafik {True, False, None} Effekt nur bei Vektor-Renderern (pdf, postscript) solid_ capstyle {″butt″, ″round″, ″projecting″} see dashed_capstyle solid_ joinstyle {″miter″, ″round″, ″bevel″} see dashed_joinstyle *transform Koordinatentransformation (z.B. „axes“ coordinates (0..1) statt Datenkoordinaten) (siehe unten) url {a URL string} ??? visible {True, False} zorder Anordnung („layer“) auf der Leinwand. Höhere Werte werden später gezeichnet {int} … (siehe http://matplotlib.org/api/pyplot_api.html)
Plot Optionen - Demo clip see plot_options_demo.py
Custom plot markers plt.plot(…, marker= ) Regular polygons can be defined with a tuple (nedges, type, angle): (7, 0, 30) - polygon (7, 1, 30) - star (7, 2, 30) - asterisk Letters, numbers and math symbols can be plotted via LaTex strings: r′$\sum′ r′$\tau′ Use raw strings, else \t will be interpreted as TAB! regular polygons funktionierten nicht an der Uni Bonn (3. Dez. 2012) You can define any marker using a vertex list: ((0.5,0.5),(0.,0.),(0.5,-0.5),(-0.5,-0.5), (0.,0.),(-0.5,0.5),(0.5,0.5)) a tuple of tuples … or a path object (see http://matplotlib.org/api/path_api.html#matplotlib.path.Path)
Plot Optionen festlegen Durch Keyword Argumente im plot Befehl A la MATLAB durch den plt.setp Befehl Durch Aufruf der entsprechenden set_... Methode des jeweiligen Objekts
Titel, Text und Achsenbeschriftungen plt.xlabel(″x-Achse″) plt.ylabel(″y-Achse″) plt.title(″Mein toller Plot″) plt.text(x, y, ″Annotation″) plt.annotate(…) plt.suptitle(″Bildueberschrift″) plt.figtext(x, y, ″Bildtext″) ax.set_xlabel(…) ax.set_ylabel(…) ax.set_title(…) ax.text(…) ax.annotate(…) fig.suptitle(…) fig.text(…) suptitle title xlabel ylabel
Beschriftung mit mathematischen Symbolen Alle Textobjekte in Python matplotlib können mathematische Zeichen enthalten „mathtext“ stellt einen großen Umfang der Latex Zeichen dar raw string normal text group mathtext
Anpassung von Plot-Optionen Beispiel: Temperatur-Zeitreihen (Dateien aus Teil 4: meteo_record_bonn-endenich_2011.csv und meteo_record_bonn-endenich_2012.csv) Einfacher Plot Linienstil und Farben, Symbole, Achsenbeschriftungen, formatiertes Datum Text-Kontrolle, mathematischer Text, Überschriften, weitere Plot-Optionen Axes Layout Kontrolle, mehrere Plots (=Axes), gemeinsame Achsen, weitere Textkontrolle Etwas Datenprozessierung, Überlagerung zweier Kurven mit Transparenz, Datumsumwandlung, forcierte Labels, Legende
1. Einfacher Plot Daten einlesen csv2rec: Variablennamen sind immer lowercase (s. Teil 4)
1. Einfacher Plot Ergebnis Achsen werden automatisch skaliert, x-Achse wird automatisch als Datum beschriftet, Farben werden automatisch gewählt
2. Linienstil und Farben, Symbole, Achsenbeschriftungen, formatiertes Datum Daten einlesen rote Kreise mit durchgezogener Linie Achsenbeschriftung Definiere Datumsformat (s. Teil 4) Wende Format an
2. Linienstil und Farben, Symbole, Achsenbeschriftungen, formatiertes Datum Ergebnis
3. Text-Kontrolle, mathematischer Text, Überschriften, weitere Plot-Optionen Daten einlesen Font-Eigenschaften Setze Font-Eigenschaften als default Fasse Plot- Optionen in dictionary zusammen Übergebe keywords als dict ein bisschen Mathe-Text
3. Text-Kontrolle, mathematischer Text, Überschriften, weitere Plot-Optionen Ergebnis
4. Axes Layout Kontrolle, mehrere Plots (=Axes), gemeinsame Achsen, weitere Textkontrolle Lese jeweils zwei Temperaturvariablen aus einer Datei
4. Axes Layout Kontrolle, mehrere Plots (=Axes), gemeinsame Achsen, weitere Textkontrolle rows columns pos enthält: x0, y0, x1, y1, width, height
4. Axes Layout Kontrolle, mehrere Plots (=Axes), gemeinsame Achsen, weitere Textkontrolle Unicode Grad-Symbol \u00B0 Ausrichten der y-Achsen Beschriftung
4. Axes Layout Kontrolle, mehrere Plots (=Axes), gemeinsame Achsen, weitere Textkontrolle Ergebnis
5. Überlagerung zweier Kurven mit Transparenz, Datumsumwandlung, forcierte Labels, Legende Trick zur Umwandlung von datetime Objekten in „Tag im Jahr“
5. Überlagerung zweier Kurven mit Transparenz, Datumsumwandlung, forcierte Labels, Legende Text für Legende
5. Überlagerung zweier Kurven mit Transparenz, Datumsumwandlung, forcierte Labels, Legende Explizite Werte für Ticks und Beschriftung
5. Überlagerung zweier Kurven mit Transparenz, Datumsumwandlung, forcierte Labels, Legende Ergebnis
EXKURS: Objekt-Orientierte Programmierung Warum OO? Pyplot (und MATLAB) benutzen das Konzept der „current figure“ und „current axes“, d.h. das Programm merkt sich die letzten Einstellungen Interaktive Anwendungen mit GUI oder Grafiken mit mehreren Panelen, die voneinander abhängen sollen, sind mit Pyplot zu beschränkt, da jedes „Fenster“ seine eigenen Einstellungen verwalten können soll … aber das ist eher für Fortgeschrittene interessant...
EXKURS: Objekt-Orientierte Programmierung Matplotlib Klassen (nur die wichtigsten) Figure: quasi das Blatt Papier bzw. die Datei, auf dem/in der alle Plots angeordnet sind Axes: ein rechteckiger Bereich, der ein Koordinatensystem hat und in dem gezeichnet werden kann. Jeder „subplot“ definiert seine eigenen axes. Artist: Basisklasse für alles, das gezeichnet wird Line2D: Linien und Symbole patches: Polygone text: Text und TextWithDash colors, cm: Farbdefinitionen und Farbtabellen ticker: Formatierung von Achsenabschnitten Da kommen wir später vielleicht drauf zurück. Erst einmal nicht so wichtig; hilft aber u.U. bei der Suche nach keyword Optionen etc.
EXKURS: Objekt-Orientierte Programmierung OO Beispiel (Forts.) Rückgabewert von ax.plot ist eine Line2D Instanz. Diese kann man benutzen, um die Eigenschaften der Kurve nachträglich zu ändern: Tipp: line, = … ist das sogenannte „tuple unpacking“. Der plot Befehl gibt immer eine Liste von Linienobjekten zurück. Statt lines = ax.plot(…) ; line = lines[0] kommt man durch tuple unpacking mit einem Befehl aus. Siehe auch: http://matplotlib.org/contents.html
HowTo: Achsen ohne Ticks und Beschriftung ax.get_xaxis().set_visible(False) ax.get_yaxis().set_visible(False) oder: ax.get_xaxis().set_ticks([]) ax.get_yaxis().set_ticks([]) (die zweite Variante erlaubt immer noch ein xlabel bzw. ylabel anzuzeigen) Hat man das ax Objekt nicht, kann man es ermitteln: ax = fig.get_axes()[0] (sofern man das fig Objekt kennt) (ax ist eine Liste von Achsensystemen!) oder: ax = plt.gca() (ermittelt das aktuelle Achsenobjekt in pyplot) Beispiel für gca() aus der Matplotlib Referenz: ax = plt.gca() ax.set_ylim([0,10]) oder (pylab, ipython way): plot(t,s) set(gca(), „ylim“, [0,10])
Anhang 1: Die Pyplot Befehle Darstellung 1-dimensionaler Daten Darstellung 2-dimensionaler Daten Statistische Plots Autokorrelation, Spektralanalyse, etc. Einbettung von Bildern Grafik anzeigen und speichern Beschriftung, Titel, Legende Grafische Elemente Kontrolle der Achsendarstellung Farbtabellen, Farbmanagement Figure und Axes Kontrolle Sonstiges errorbar bzw. plot: errorbar kann imme rnur eine Kurve zeichnen, plot auch mehrere gleichzeitig Ausgelassen: matshow over pause spy subplot2grid subplot_tool subplots_adjust switch_backend (experimental) table tight_layout (für subplot) waitforbuttonpress
Pyplot: 1-dimensionale Daten Method Function errorbar Kurve mit Fehlerbalken loglog, semilogx, semilogy Plot mit logarithmischen Achsen plot zeichne Linien und/oder Symbole plot_date zeichne Kurven mit Datums (x) Achse plotfile Lese Daten aus Datei und plotte polar Polarplot scatter x,y Scatterplot step Stufenplot errorbar bzw. plot: errorbar kann imme rnur eine Kurve zeichnen, plot auch mehrere gleichzeitig errorbar plot_date polar scatter
Pyplot: 2-dimensionale Daten Method Function barbs Windsymbole (Richtung und Geschwindigkeit) contour, contourf Konturplot (clabel für Beschriftung) mit Linien bzw. gefüllt hexbin „hexagon binning plot „ hist2d 2D Histogramm (ähnlich hexbin) pcolormesh Farbgitter-Plot (auch pcolor) quiver 2D Feld von Pfeilen (z.B. Windvektoren) streamlines Strömungslinien tricontour, tricontourf Konturplot mit Triangulation (Linien bzw. gefüllt) tripcolor Farbfeld mit Triangulation triplot Gitterplot mit Triangulation errorbar bzw. plot: errorbar kann imme rnur eine Kurve zeichnen, plot auch mehrere gleichzeitig Ausgelassen: matshow over pause spy subplot2grid subplot_tool subplots_adjust switch_backend (experimental) table tight_layout (für subplot) waitforbuttonpress hist2d barbs contour tricontourf streamlines triplot hexbin
Pyplot: Statistische Plots Method Function bar Balkendiagramm, optional mit Fehlerbalken barh Horizontaler Barplot boxplot Box und Whisker Plot (auch horizontal) hist Histogramm pie Tortendiagramm errorbar bzw. plot: errorbar kann imme rnur eine Kurve zeichnen, plot auch mehrere gleichzeitig Ausgelassen: broken_barh matshow over pause spy stackplot stem subplot2grid subplot_tool subplots_adjust switch_backend (experimental) table tight_layout (für subplot) waitforbuttonpress bar boxplot hist pie
Pyplot: Autokorrelation etc. Method Function acorr Autokorrelation cohere Kohärenzplot csd „cross spectral density“ psd Powerspektrum specgram Spektrogramm xcorr Kreuzkorrelation acorr cohere psd errorbar bzw. plot: errorbar kann imme rnur eine Kurve zeichnen, plot auch mehrere gleichzeitig Ausgelassen: matshow over pause spy subplot2grid subplot_tool subplots_adjust switch_backend (experimental) table tight_layout (für subplot) waitforbuttonpress xcorr csd specgram
Pyplot: Einbettung von Bildern Method Function imread Bilddatei einlesen imsave Bild in Datei speichern imshow Bild darstellen errorbar bzw. plot: errorbar kann imme rnur eine Kurve zeichnen, plot auch mehrere gleichzeitig Ausgelassen: matshow over pause spy subplot2grid subplot_tool subplots_adjust switch_backend (experimental) table tight_layout (für subplot) waitforbuttonpress siehe auch http://matplotlib.org/users/image_tutorial.html
Pyplot: Grafik anzeigen&speichern Method Function savefig Bild als (png) Datei speichern show Bild in einem interaktiven Fenster anzeigen Interaktive Grafik nach show()
Pyplot: Beschriftung, Titel Method Function annotate Text und Pfeil colorbar Farbbalken zeichnen figlegend Legende für eine Figure (siehe legend) figtext Text der Figure hinzufügen (siehe text) legend Legende (für Axes) suptitle Überschrift für die Figure text Text (in ein Axes Objekt) title Titel eines Axes Objekts annotate
Pyplot: Grafische Elemente Method Function arrow Pfeil axhline, axvline horizontale/vertikale Linie über die gesamte Breite/Höhe axhspan, axvspan Rechteck über die gesamte Breite/Höhe fill Zeichne gefüllte Polygone fill_between, fill_betweenx Fülle Zwischenraum zwischen zwei Kurven hlines, vlines Horizontale und vertikale Linien rgrid, thetagrids Radiale Gitterlinien für einen Polarplot und deren Position vlines axvline axvspan axhspan axhline hlines fill_between
Pyplot: Achsenkontrolle Method Function autoscale Berechne Skalierung der Achsen axis Lese oder setze Achseneigenschaften box Rahmen um Achsen an oder ausschalten grid Schalte Achsengitter an oder aus locator_params, tick_params Achsen-Ticks Eigenschaften minorticks_off, minorticks_on Schalte Achsen-Subticks aus/an ticklabel_format Formatiere Achsenbeschriftung twinx, twiny Zweite x bzw y Achse xlabel, ylabel Achsenbeschriftungen xlim, ylim Achsen-Wertebereich xscale, yscale lineare bzw. logarithmische Skalierung xticks, yticks Tickpositionen und Label
Pyplot: Farbtabellen etc. Method Function autumn, bone, cool, copper, flag, gray, hot, hsv, jet, pink, prism, spectral, spring, summer, winter Wahl der entsprechenden Farbtabelle clim Setze Farbgrenzen für Bilder set_cmap Setze Farbtabelle
Pyplot: Figure und Axes Kontrolle Method Function axes Füge Axes Objekt zur Figure hinzu cla, clf Lösche aktuelle Axes bzw. Figure delaxes Lösche ein Axes Objekt aus der Figure figure Erstelle neues Figure Objekt gca, gcf, gci Liefere aktuelle Axes, Figure, bzw. „Bild“ („colorable artist“) margin Ränder (um Axes) einstellen sca Setze eine Axes als aktuelle subplot Erzeuge eine neue Axes und ordne sie auf der Figure an subplots Erzeuge rows*columns Achsensysteme (optional mit geteilten Achsen)
Pyplot: Sonstiges Method Function get_plot_commands Liste der verfügbaren Plot Befehle (quasi Online-Hilfe) rc, rcdefaults Setze Default-Einstellungen (nützlich z.B. zur Wahl der Schriftart) setp Setze Artist Eigenschaften
Pyplot: …und noch mehr… broken_barh close connect disconnect draw findobj figimage get_current_fig_manager get_figlabels get_fignums ginput hold ioff ion ishold isinteractive matshow over pause sci spy subplot2grid subplot_tool subplots_adjust switch_backend (experimental) table tight_layout (für subplot) waitforbuttonpress