Open Source im professionellen Einsatz

Horizontal und vertikal

Facetten lassen sich nicht nur in horizontaler Richtung einsetzen. Auch eine vertikale Aufspaltung des Plots ist möglich – mit »facet_grid(Variable~.)« . Dabei darf man den abschließenden Punkt nicht vergessen, der aus formalen Gründen notwendig ist. Selbstverständlich kann der Anwender auch beide Varianten kombinieren: Die Facettierungsangabe

facet_grid(Algorithmus~Konfiguration)

produziert das in Abbildung 5 gezeigte Ergebnis. Die überflüssig gewordene »colour« -Ästhetik ist dabei entfallen: Bei gedruckten Publikationen kann eine reine Schwarz-Weiß-Darstellung manchmal vorteilhaft sein, um teuren Farbdruck zu vermeiden. Alternativ könnte man weitere Variablen auf die nun nicht mehr verwendete Farbe legen, um den Plot mit mehr Informationen anzureichern.

Abbildung 5: Zweidimensionale Facettierung ohne Farbe.

Abbildung 5: Zweidimensionale Facettierung ohne Farbe.

Facetting funktioniert dann gut, wenn die aufgespaltete Variable nur wenige unterschiedliche Werte besitzt – drei im Artikel-Beispiel. Bis zu einer gewissen Grenze an Variationsmöglichkeiten kann der Anwender auf Farben ausweichen, bei mehr Variabilität empfiehlt es sich, unterschiedliche Symbolgrößen (»size« -Ästhetik) zu verwenden. Alternativ ließen sich hochkategorielle Rohdaten auch durch entsprechendes Preprocessing (was sehr gut mit R möglich ist) zu einer übersichtlicheren Anzahl von Kategorien zusammenfassen.

Während Abbildung 3 vom oben erwähnten Untertauchen in zu vielen Details bedroht ist, zeigen sich die Alternativen in den Abbildungen 4 und 5 übersichtlicher. Welche Darstellungsform besser geeignet ist, entscheidet der Anwender von Fall zu Fall, am besten mit Hilfe kompetenter Literatur wie [5].

Wichtig aus Anwendersicht ist vor allem, dass der Aufwand zwischen den Varianten sich nicht ändert: Ggplot2 übernimmt automatisch alle lästigen Details wie die Positionierung der Subgraphen oder das Achsenlayout – wer sich an gekachelten Plots mit anderen Programmen versucht hat, kann ein Lied von nervtötenden Detailarbeiten singen, die nötig sind, um ein zufriedenstellendes Resultat zu erreichen. Ganz ohne manuelle Nacharbeit geht es aber auch bei Ggplot2 in der Praxis leider nicht. Der Aufwand fällt jedoch glücklicherweise meist gering aus.

Als Beispiel aus dem Arbeitsalltag zeigt dieser Artikel abschließend das Ergebnis von Latenzmessungen, die auf einem Dualcore-System zwischen einer Echtzeit- (RT-) und einer Nicht-Echtzeit-Variante (Non-RT) von Linux durchgeführt wurden. Jeder Messpunkt speichert eine Verzögerung (Latenz) zusammen mit der Information, auf welcher CPU und in welchem Modus (Echtzeit oder nicht) die Messung stattfand.

Daten zusammenfassen

Im Unterschied zum bisherigen Beispiel liegt hier eine hohe Anzahl von Messwerten vor (mehrere Tausend, die Rohdaten sind online unter [6] verfügbar), weshalb sich als grafisches Objekt ein zusammenfassendes Histogramm empfiehlt. Listing 6 zeigt den Code, der den Plot in Abbildung 6 erzeugt. Die manuellen Korrekturen beziehen sich vor allem auf die Achsen: Neue Schlüsselwörter schränken die Daten in x-Richtung auf den Wertebereich 1 bis 500 ein (»xlim()« ) und verschönern die Beschriftung der logarithmischen y-Achse (Argumente für »scale_y_log10()« ). Das Kommando »theme_bw()« wählt eine alternative Stilvorgabe aus, die den Plot für die Darstellung in Schwarz-Weiß optimiert.

Listing 6

Feinschliff

01 g <- ggplot(data=latency,
02             aes(x=total_observed_delay)) +
03   geom_histogram(binwidth=1) +
04   scale_y_log10(breaks=c(1, 10, 100, 1000),
05                 labels=c("1", "10", "100", "1000")) +
06   xlim(1,500) + facet_grid(type~CPU) +
07   xlab(expression(paste("Delay [", mu, "s]"))) +
08   ylab(" # samples [a.u.]")  + theme_bw()
Abbildung 6: Histogramm-Beispiel: Latenzmessungen am Linux-Kernel.

Abbildung 6: Histogramm-Beispiel: Latenzmessungen am Linux-Kernel.

Die größte Neuigkeit versteckt sich im grafischen Objekt. Der Plot zeigt keine direkte Abbildung der Originaldaten, sondern führt eine (implizite) statistische Transformation durch: Das Histogramm (»geom_histogram()« ) fasst alle Latenzen zusammen, die in einen Bereich mit einer bestimmten zeitlichen Breite fallen. Jeden Bereich repräsentiert ein Balken, dessen Höhe proportional zur Anzahl der darin enthaltenen Messpunkte ist. Anders als Linien und Punkte basieren solche komplizierteren grafischen Objekte nicht immer auf direkten Abbildungen der Originaldaten.

Auf die ebenfalls vorhandene Möglichkeit, explizite statistische Transformationen in den Plot-Prozess einzubinden, kann dieser Artikel nicht im Detail eingehen. Ein guter Einstiegspunkt hierfür ist jedoch die erschöpfende Sammlung der Schlüsselwörter (Geoms, statistische Transformationen, Skalen, Layout-Parameter und so weiter), die sich auf der Ggplot2-Homepage [3] findet.

Ein unverzichtbarer Begleiter für die tägliche Arbeit mit der Software ist das Buch des Ggplot2-Autors Wickham [4]. Leider ist noch keine wirklich umfassende Einführung zu Ggplot2 im Web frei verfügbar, aber die Investition ins Buch lohnt sich in jedem Fall – und wird vermutlich auch die Weiterentwicklung und Pflege des Pakets unterstützen.

Neben den genannten Ressourcen gibt es (knapp gehaltene) Hilfeseiten für alle Befehle, die allerdings nicht über den klassischen Manpage-Mechanismus, sondern direkt in R durch Eingabe von »?Stichwort« verfügbar sind, beispielsweise »?geom_line« .

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 5 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Als digitales Abo

Als PDF im Abo bestellen

comments powered by Disqus

Ausgabe 07/2013

Preis € 6,40

Insecurity Bulletin

Insecurity Bulletin

Im Insecurity Bulletin widmet sich Mark Vogelsberger aktuellen Sicherheitslücken sowie Hintergründen und Security-Grundlagen. mehr...

Linux-Magazin auf Facebook