ggplot, ggplot, gg all the way …

Lea Waniek Blog, Statistik

.. oh what fun, it is to write, an R blog for this day!

Der Grundgedanke von ggplot2

Das erklärte Ziel von Hadley Wickham’s package ggplot2, ist es R-Usern zu ermöglichen Daten einfach, ansprechend und vor allem informativ zu visualisieren. Dabei wurde angestrebt die Vorteile von sowohl base-R als auch dem älteren Package lattice zu übernehmen und deren Schwächen auszugleichen.

Die Befehlsstruktur und der Aufbau von Graphen in ggplot2 fußt auf der Philosophie zur Datenvisualisierung von Leland Wilkinson’s The Grammar of Graphics. Die Struktur von ggplot2-Befehlen ist nicht ganz trivial und kann in aller Kürze wie folgt zusammengefasst werden:
Die Eigenschaften eines ggplot2-Graphen werden durch ein oder mehrere, übereinandergelegte, sogenannte Layer festgelegt. Ein ggplot-Objekt wird über „ggplot()“ initiiert, hier können über das Argument „data =“ die Datenbasis und über die Argumente in „aes(…)“ die auf die geometrischen Objekte sowie ästhetischen Attribute (=Aesthetics) abzubildende Variablen festgelegt werden. Innerhalb von „ggplot()“ gemachte Angaben werden von nachfolgenden Layern als Default übernommen.Danach wird in mindestens einem Layer der Typus der Datendarstellung, sowie wenn vom Default abweichend, die darzustellende Variablen bestimmt. Dabei setzt sich ein Layer stets aus mehreren/gewissen Komponenten zusammen: Einem über „geom_…“ spezifizierten geometrischen Objekt (=Geom, z.B. Punkte, Linien, Rechtecke) zur Abbildung der Daten, eine statistische Transformation (Argument „stat“) der Daten, Angaben zur genauen Positionierung des Plotelements (Argument „position“) und gegebenenfalls eine vom Default abweichende Datenbasis sowie die Attribute (=Aesthetics, z.B. Zuweisung zu den Achsen sowie Farben, Formen, Größen) mit welchen die Daten abgebildet werden.

Innerhalb eines Plots können mehrere Layer übereinandergelegt werden, darüber hinaus stehen zahlreiche weitere Optionen zur Anpassung des nicht-datenbasierten Designs der erstellten Graphen zur Verfügung. Alle Spezifikationen werden über ein „+“ verbunden.

Die Anwendung von ggplot2 bei STATWORX

Die Datenvisualisierung ist ein absolut integraler Bestandteil der Datenexploration aber auch Ergebnisaufbereitung und -präsentation und damit aus dem Arbeitsalltag eines Data Scientists schlicht und einfach nicht wegzudenken. Daher steht das Erstellen von Graphen, gerade mit dem äußerst flexiblen und eleganten Packet ggplot2, auch bei STATWORX an der Tagesordnung. Die gesammelten R-Scripte auf dem STATWORX-Server beweisen dies deutlich.

Eine Möglichkeit, um einen Überblick über Typen der tatsächlich genutzten Geoms und die Häufigkeit ihrer Nutzung zu gewinnen, ist das Erstellen einer Wordcloud in R. Hierfür wurden alle R-Skripte im Projektordner des STATWORX-Servers, Zeile für Zeile eingelesen und alle mit „geom_“ beginnenden und vor „(“ stehenden Zeichenfolgen extrahiert. Zur Darstellung/Visualisierung der Häufigkeiten aller so extrahierten Geoms wurde eine Wordcloud erzeugt: Je häufiger ein Geom in den gesammelten R-Skripten genutzt wurde, desto größer der Schriftzug in der Wordcloud.

Wordcloud der geoms

Anwendungsbeispiel anhand der gängigsten Geoms

Der aktuelle Blogeintrag ist der erste in einer Reihe von Einträgen zum Thema Datenvisualisierung mit ggplot2. Dabei sollen in den nachfolgenden Einträgen weniger bekannte, aber in spezifischen Anwendungsfällen äußerst nützliche Geoms vorgestellt werden. An dieser Stelle werden der Vollständigkeit halber allerdings die wohl allgemein am häufigsten genutzten Geoms vorgestellt, da sie auch in dem in der Wordcloud gespiegelten Arbeitsalltag bei STATWORX die prominenteste Stellung einnehmen. Dies soll nur kleiner Vorgeschmack, keine ausführliche Abhandlung, sein, da diese an anderer Stelle bereits zu Genüge erfolgt ist.

Die Wordcloud zeigt, dass am häufigsten Lineplots, Balkendiagramme, Histogramme und Scatterplotsverwendet werden. Lineplots und Scatterplots, stellen die Beobachtungswerte der Y-Variable geordnet nach Ausprägung der X-Variable dar. Scatterplots bilden dabei nur die tatsächlichen Datenpunkte ab, Lineplots verbinden diese und sind daher nur sinnvoll, wenn die durch die X-Werte implizierte Reihenfolge inhaltlich sinnvoll ist. Histogramme bilden die Verteilung einer kontinuierlichen Variable über beliebig wählbare Kategorien ab, während Balkendiagramme die Verteilung einer kategorialen Variable über ihre feststehenden Kategorien.

Im nachstehende Anwendungsbeispiel soll anhand der am häufigsten genutzten Geoms demonstriert werden, wie verschiedene Layers geschichtet werden können, um einen Plot ganz nach den eigenen Vorstellungen zu gestalten. Auch soll die Konsistenz der Befehlsstruktur verdeutlicht werden und aufgezeigt werden, wie innerhalb der einzelnen Layers die genutzte Datenbasis und die abzubildenden Variable(n) aber auch der Linientyp, Form, Größe und Farbe der geometrischen Objekte bestimmt werden können.

Weihnachtsbaum mit ggplot

##  Erstellung Beispieldatensatz 
h  <- c(1.1, 2, 2.2, 3.1, 3.3, 3.4, 4.1, 4.2, 4.3, 4.4,
        5, 5.2, 5.3, 6.3, 6, 7.2) 
b  <- c(1, 2, 2, 3, 3, 3,4, 4, 4, 4, 5, 5, 5, 6, 6, 7) 
l1 <- c(1.2, 2, 3 ,4 , 5, 6, 6.8, NA, NA, NA, NA, NA,
        NA, NA, NA, NA) 
l2 <- c(0, 2, 0, 4, 0, 2, 0, NA, NA, NA, NA, NA, NA,
        NA, NA, NA) 
p1 <- c(0.9, 1.8, 2.1, 3, 3.3, 3.8, 4.4, 4, 4.8, 5.3,
        5.7, 6.3, 7.2, NA, NA, NA)  
p2 <- c(0.7, 1.1, 0.3, 1.3, 2.9, 0.5, 2.2, 3.7, 2.7,
        1.3, 0.4, 1.7, 0.9, NA, NA, NA) 
p4 <- c(7.2, 6.3, 5.7, 5.3, 4.4, 3.8, 3.3, 3.0, 2.3,
        1.9, 0.9, 4.2, NA, NA, NA, NA) 
p3 <- c(0.3, 1.1, 0.6, 1.7, 0.9, 3.1, 2.6, 1.5, 0.8,
        1.7, 0.4, 1.9, NA, NA, NA, NA) 

df <- dplyr::data_frame(h, b, l1, l2, p1, p2, p3, p4) 

## Erstellung des Plots 
# der Konsistenz halber sind auch Default-Argumente explizit spezifiziert.  
library(ggplot2) 

# Initiierug des ggplot-Objekts 
# Spezifikation... 
#   ...der Default-Datenbasis und der Default-X-Variable 
ggplot(data = df,  
       mapping = aes(x = h)) +  
   
  # Layer #1: Histogramm 
  geom_histogram(stat = "bin", 
                 binwidth = 1,  
                 position = "stack", 
                 fill = "darkgreen") + 
   
  # Layer #2: Balkendiagramm 
  geom_bar(data = df,  
           mapping = aes(x = b), 
           stat = "count", 
           position = "stack", 
           fill = "forestgreen") + 
  
  # Layer #3: Liniendiagramm
  geom_line(data = df,  
            mapping = aes(x = l1, y = l2), 
            stat = "identity", 
            position = "identity", 
            color = "ivory",  
            linetype = "dotdash",  
            size = 0.9) + 
   
  # Layer #4: Scatterplot (Kugeln)
  geom_point(data = df,  
             mapping = aes(x = p1, y = p2),  
             stat = "identity", 
             position = "identity",                 
             color = "red2",  
             size = 10, 
             shape = 16) + 
   
  # Layer #5: Scatterplot (Sterne)
  geom_point(data = df,  
             mapping = aes(x = p4, y = p3),  
             stat = "identity", 
             position = "identity",                   
             color = "gold",  
             size = 14,  
             shape = 8) + 
   
  # Wahl eines vorgefertigten Designs für die nicht-datenbasierten Elemente        
  theme_minimal() + 
   
  # Labeln der X- und Y-Achse 
  ylab("Statworx wünscht...") + 
  xlab("...frohe Weihnachten!")

Referenzen

  1. Wilkinson, L. (2006). The grammar of graphics. Springer Science & Business Media.
  2. Wickham, H. (2016). ggplot2: elegant graphics for data analysis. Springer.
Über den Autor
Lea Waniek

Lea Waniek

I am a data scientist at STATWORX, apart from machine learning, I love to play around with RMarkdown and ggplot2, making data science beautiful inside and out.