Open Source im professionellen Einsatz

Datenkolonnen

Der Beispieldatensatz in Listing 1 soll dazu dienen, die Prinzipien von Ggplot2 zu demonstrieren. Die Daten liegen in Form einer CSV-Datei vor, einem einfachen, aber universellen Datenformat, das beinahe jede Applikation exportieren kann. Die Daten beschreiben ein Experiment, das die Leistung der Algorithmen »foo« , »bar« und »hyper« misst, die auf Datensätze unterschiedlicher Größe (»Datenumfang« ) angewendet werden. Die Geschwindigkeit, wie viele Daten sie pro Zeit verarbeiten, gibt die Spalte »Durchsatz« an. Zudem unterscheiden die Messdaten zwischen den drei Konfigurationen »A« , »B« und »C« .

Listing 1

Beispieldatensatz

01 Algorithmus,Datenumfang,Durchsatz,Konfiguration
02 foo,32,6.67,A
03 foo,64,7.19,A
04 foo,128,7.60,A
05 foo,256,8.03,A
06 foo,512,8.21A
07 foo,32,6.79,B
08 foo,64,6.60,B
09 foo,128,7.45,B
10 [...]
11 foo,512,8.21,C
12 bar,32,4.00,A
13 bar,64,6.92,A
14 bar,128,11.17,A
15 [...]
16 bar,256,16.01,C
17 bar,512,19.97,C
18 hyper,32,6.62,A
19 hyper,64,8.40,A
20 [...]

Das Szenario ähnelt vielen Situationen, die im Alltag von Programmierern oder Administratoren auftreten. In der Praxis müssen sie die Daten zwar meist erst aus Logdateien oder anderen Quellen extrahieren, da dieser Schritt aber nichts mit der Visualisierung zu tun hat, kann er hier entfallen.

Daten sind in Ggplot2 durch Data Frames repräsentiert, einer R-Datenstruktur ähnlich den Listen oder Arrays, die aus anderen Programmiersprachen bekannt sind. Jeder Data Frame besteht aus einer beliebigen Anzahl von Zeilen und Spalten, von denen jede einen Namen tragen kann. Wie im Beispiel reicht es für Ggplot2 aus, wenn die Spalten benannt sind. Listing 2 zeigt, wie das R-Kommando »read.csv« aus der CSV-Datei einen Data Frame erzeugt.

Listing 2

Data Frame erzeugen

01 dat <- read.csv("data.txt", header=T)
02 print(dat)
03       Algorithmus Datenumfang Durchsatz Konfiguration
04 1     foo          32         6.675104             A
05 2     foo          64         7.190872             A
06 3     foo         128         7.684894             A
07 4     foo         256         8.038377             A
08 [...]

Das Argument »header=T« weist R an, die Beschriftungen der Spalten aus der ersten Zeile der Textdatei zu übernehmen. Der R-Zuweisungsoperator »<-« speichert die Daten in der Variablen »dat« . Mit dem abschließenden »print()« -Befehl lässt sich prüfen, ob die Daten korrekt eingelesen wurden.

Der Einfachheit halber steht zunächst lediglich eine Teilmenge, der Algorithmus »foo« , zur Debatte. GNU R stellt dazu das Subset-Kommando bereit, das einen verkleinerten Data Frame erzeugt:

dat.sub <- subset(dat, Algorithmus=="foo")

Zum Umwandeln der Rohdaten in eine Grafik dienen die R-Aufrufe in Listing 3. Das Resultat zeigt Abbildung 1.

Listing 3

Grafik erzeugen

01 g <- ggplot(data=dat.sub,
02             aes(x=Datenumfang, y=Durchsatz,
03                 colour=Konfiguration)) +
04      geom_point() + geom_line()
05 print(g)

Abbildung 1: Die erste Visualisierung: Leistungsmessung für den Algorithmus foo mit drei verschieden eingefärbten Konfigurationen.

Daten und Ästhetik

Die Transformation erfolgt in zwei Schritten: Das »ggplot« -Basisobjekt legt neben der Datenquelle, dem zuvor angelegten Data Frame »dat.sub« , ein ästhetisches Mapping fest. Das Mapping beschreibt, welche Aspekte der Daten Ggplot2 auf welche Komponenten des resultierenden Graphen abbildet. Listing 3 bestimmt, dass Durchsatz (y-Achse) über Datenumfang (x-Achse) zu plotten ist. Eine weitere Komponente der Daten, die Messkonfiguration, ist mit »colour« farbig kodiert, sprich: Pro Konfiguration verwendet Ggplot2 eine Farbe.

Die Zuordnungen des Basisobjekts beschreiben allerdings noch nicht, welches grafische Objekt für die Datenpunkte zur Verwendung kommt, die durch Datensatz und ästhetisches Mapping beschrieben sind. Grafische Objekte verwaltet Ggplot2 in Ebenen (Layers), die je ein solches Objekt enthalten.

Ein Plot kann aus mehreren übereinandergelegten Ebe-nen bestehen – Ggplot kümmert sich automatisch darum, dass die äußeren Parameter der Grafik, etwa Größe und Achsenbeschriftung, in allen Ebenen übereinstimmen. Das Erzeugen eines Ebenen-Objekts übernimmt eine Funktion nach dem Muster »geom_Typ« , wobei Typ das verwendete grafische Objekt angibt.

Listing 3 verwendet zwei Ebenen mit einfachen grafischen Objekten: Punkten (»geom_point()« ) und Linien (»geom_line()« ). Ggplot2 addiert beide zum Basisobjekt hinzu. Dabei überträgt die Software die Einstellungen des Basisobjekts (Datenquelle und ästhetisches Mapping) in die Ebenen. Durch das Zusammenschalten des Basisobjekts mit den Ebenen-Objekten entsteht ein neues, kombiniertes R-Objekt, das sich mit dem generischen Print-Kommando ausgeben lässt. Das Resultat ist allerdings kein Text auf der Konsole, sondern eine Grafik am Bildschirm.

Natürlich kann man Plots auch permanent speichern. Das Kommando

ggsave("/tmp/graph.pdf", g)

schreibt den in »g« enthaltenen Plot im PDF-Format in die angegebene Datei. Das gewünschte Dateiformat erkennt Ggplot2 automatisch an der Datei-Endung. Neben PDF stehen unter anderem PNG, JPEG, EPS und SVG zur Auswahl. Standardmäßig stellt die Software Abbildungen im Format 9,75 mal 4,6 Zoll bereit, was 24,75 mal 11,7 Zentimetern entspricht. Ändern lässt sich dies über die Parameter »height« und »width« . Rastergrafikformate wie JPG und BMP verwenden gewöhnlich eine Auflösung von 300 dpi, die über den »dpi« -Parameter anpassbar ist.

Um ein rechteckiges PNG mit 5 Zoll Kantenlänge in hoher Auflösung zu zeichnen, ist daher

ggsave("plot.png", g, height=5, width=5, dpi=1200)

der Befehl der Wahl. Selbstverständlich sollte man Vektorformate bevorzugen, um die bekannten Skalierungsprobleme, eckigen Kanten und hässlichen Artefakte bei der Weiterverwendung zu vermeiden.

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