Trulli
from today.com

Überblick

In diesem Practical wirst du üben mit ggplot2 Grafiken zu erstellen.

Am Ende des Practicals wirst du wissen wie man:

  1. Einen Plot Schritt-für-Schritt aufbaut.
  2. Verschiedene geoms verwendet.
  3. Farben verändert.

Aufgaben

A - Setup

  1. Öffne dein TheRBootcamp R project. Es sollte die Ordner 1_Data und 2_Code enthalten.

  2. Öffne ein neues R Skript. Schreibe deinen Namen, das Datum und “Plotting Practical” als Kommentare an den Anfang des Skripts.

## NAME
## DATUM
## Plotting Practical
  1. Speichere das neue Skript unter dem Namen plotting_practical.R im 2_Code Ordner.

  2. Lade tidyverse und ggthemes.

B - Lade den Datensatz

  1. Verwende die read_csv() Funktion um den Datensatz mcdonalds als Objekt mcdonalds einzulesen. Denke an den Trick mit den Anführungszeichen.
# Lese mcdonalds
mcdonalds <- read_csv('1_Data/mcdonalds.csv')
  1. Printe den Datensatz. Wurden alle Variablentypen korrekt identifiziert?

  2. Verwende summary() um einen weiteren Überblick über die Daten zu bekommen.

C - Baue einen Plot

In diesem Abschnitt wirst du den folgenden Plot Schritt-für-Schritt zusammenbauen.

  1. Verwende ggplot() um einen leeren Plot für den mcdonalds Datensatz zu starten.
ggplot(data = mcdonalds)
ggplot(mcdonalds)

  1. Verwende nun das mapping-Argument und die aes()-Helferfunltion um Calories der x-Achse und SaturatedFat der y-Achse zuzuweisen.
ggplot(data = mcdonalds, 
       mapping = aes(x = XX, y = XX))
ggplot(mcdonalds, aes(x = Calories, y = SaturatedFat))

  1. Ergänze geom_point() mit + um Punkte zu plotten.
ggplot(mcdonalds, aes(x = Calories, y = SaturatedFat)) +
  geom_point()

  1. Verwende das col Argument in aes() um die Farbe nach der Variable Category variieren zu lassen.
ggplot(mcdonalds, aes(x = XX, y = XX, col = XX)) +
  geom_point() 
ggplot(mcdonalds, aes(x = Calories, y = SaturatedFat, col = Category)) +
  geom_point()

  1. Ergänze + geom_smooth() um eine gefittete Linie zu ergänzen.
ggplot(mcdonalds, aes(x = XX, y = XX, col = XX)) +
  geom_point() + 
  geom_smooth()
ggplot(mcdonalds, aes(x = Calories, y = SaturatedFat, col = Category)) +
  geom_point() +
  geom_smooth()

  1. Oops! Hast du mehre Linien anstatt einer bekommen? Löse das Problem indem du die Farbe innerhalb von geom_smooth() auf "black" setzt.
ggplot(mcdonalds, aes(x = XX, y = XX, col = XX)) +
  geom_point() +
  geom_smooth(col = "XX") 
ggplot(mcdonalds, aes(x = Calories, y = SaturatedFat, col = Category)) +
  geom_point() +
  geom_smooth(col = "black")

  1. R versteht eine grosse Menge von Farbworten. Lasse dir diese mit colors() (ohne Argumente) anzeigen. Alle aufgeführten character Werte können verwenden werden um die entsprechende Farbe zu definieren.

  2. Verwende nun labs() um den Plot angemessen zu annotieren.

ggplot(mcdonalds, aes(x = XX, y = XX, col = XX)) +
  geom_point() +
  geom_smooth(col = "XX") +
  labs(title = "XX",
       subtitle = "XX",
       caption = "XX")
ggplot(mcdonalds, aes(x = Calories, y = SaturatedFat, col = Category)) +
  geom_point() +
  geom_smooth(col = "black") +
  labs(title = "McDonalds Nährwerte",
       subtitle = "Jeder Punkt ist ein Menü-Item",
       caption = "Quelle: Kaggle.com")

  1. Verwende xlim(), eine einfache Version von scale_x_continuous() (mehr dazu später), um die x-Achse auf die Werte 0 und 1250 zu begrenzen.
ggplot(mcdonalds, aes(x = XX, y = XX, col = XX)) +
  geom_point() +
  geom_smooth(col = "XX") +
  labs(title = "XX",
       subtitle = "XX",
       caption = "XX") +
  xlim(XX, XX)
ggplot(mcdonalds, aes(x = Calories, y = SaturatedFat, col = Category)) +
  geom_point() +
  geom_smooth(col = "black") +
  labs(title = "McDonalds Nährwerte",
       subtitle = "Jeder Punkt ist ein Menü-Item",
       caption = "Quelle: Kaggle.com") +
  xlim(0, 1250)

  1. Abschliessend verwende theme_minimal() um die Ästhetik des Plots anzupassen. Auch hierzu mehr später.
ggplot(mcdonalds, aes(x = Calories, y = SaturatedFat, col = Category)) +
  geom_point() +
  geom_smooth(col = "black") +
  labs(title = "McDonalds Nährwerte",
       subtitle = "Jeder Punkt ist ein Menü-Item",
       caption = "Quelle: Kaggle.com") +
  xlim(0, 1250) +
  theme_minimal()

D - geoms

  1. Verwende den Code unten um einen Violinen-Plot der Calories (y-Achse) in Abhängigkeit der Category (x-Achse) zu kreieren. Violinenplots zeigen mit ihrer Dicke die jeweilige relative Häufigkeit der Werte an - in diesem Fall der Kalorien. Verwende für das Argument fill ebenfalls Category, um die Violinen entsprechend einzufärben.
ggplot(data = mcdonalds, 
       aes(x = XX, y = XX, fill = XX)) +
  geom_violin()
ggplot(data = mcdonalds, 
       aes(x = Category, y = Calories, fill = Category)) +
  geom_violin()

  1. Ergänze mit labs() einen angemessenen Titel (title) und Untertitel (subtitle).
ggplot(data = mcdonalds, aes(x = XX, y = XX, fill = XX)) +
  geom_violin() +
  labs(title = "XX",
       subtitle = "XX")
ggplot(data = mcdonalds, aes(x = Category, y = Calories, fill = Category)) +
  geom_violin() +
  labs(title = "McDonalds",
       subtitle = "Kalorienverteilung pro Menü Kategorie")

  1. Ergänze guides(fill = FALSE), so dass keine Legende gezeigt wird.
ggplot(data = mcdonalds, aes(x = XX, y = XX, fill = XX)) +
  geom_violin() +
  labs(title = "XX",
       subtitle = "XX") + 
  guides(fill = FALSE)
ggplot(data = mcdonalds, aes(x = Category, y = Calories, fill = Category)) +
  geom_violin() +
  labs(title = "McDonalds",
       subtitle = "Kalorienverteilung pro Menü Kategorie") +
  guides(fill = FALSE)

  1. Verwende geom_jitter() um Punkte über die Violinen zu plotten. Setze in der Funktion width = 1 und alpha = .5.
ggplot(data = mcdonalds, 
       aes(x = Category, y = Calories, fill = Category)) +
  geom_violin() +
  labs(title = "McDonalds",
       subtitle = "Kalorienverteilung pro Menü Kategorie") +
  guides(fill = FALSE) +
  geom_jitter(width = .1, alpha = .5)

  1. Probiere ein paar Sachen aus:
  • Ändere die Werte für width oder alpha in geom_jitter().
  • Entferne fill = Category.
  • Verwende geom_boxplot() um stattdessen einen Box-Plot zu plotten.

E - geom_text

In dieser Sektion wirst du den folgenden Plot unter Verwendung von geom_text() kreieren.

  1. Beginne damit folgendes Code-Template entsprechend auszufüllen.
ggplot(mcdonalds, aes(x = XX, 
                      y = XX, 
                      col = XX)) +
  geom_point() +
  xlim(XX, XX) +
  ylim(XX, XX) +
  theme_minimal() +
  labs(title = "XX")
  1. Nun ergänze geom_text() so dass für jeden Punkt das entsprechende Item Label angezeigt wird.

  2. Wo sind die Labels? Ah, du hast ggplot nicht gesagt welche Spalte die Information beinhaltet, die in den Labels stehen soll. Behebe dieses Problem indem du innerhalb der aes() Funktion dem Argument label die Spalte Item zuweist. Führe den Code nochmal aus. Jetzt solltest du viele labels sehen!

  3. Passe geom_text() an in dem du col auf black, check_overlap auf TRUE, und hjust auf "left" setzt.

  4. Verwende nun das data Argument in geom_text() und weise ihm einen gefilterten Auschnitt des mcdonalds Datensatzes zu, nämlich data = mcdonalds %>% filter(Calories > 1100). Schau was passiert.

ggplot(mcdonalds, aes(x = Sugars, 
                      y = Calories, 
                      col = Category, 
                      label = Item)) +
  geom_point() +
  geom_text(data = mcdonalds %>% 
            filter(Calories > 1100),
            col = "black", 
            check_overlap = TRUE, 
            hjust = "left") +
  xlim(0, 150) +
  ylim(0, 2000) +
  theme_minimal() +
  labs(title = "Ergänze Labels zu einem Plot mit geom_text()")
  1. Probiere ein paar Sachen aus:
  • Verwende das size Argument in aes(), so dass die Grösse der Punkte den Calories entspricht.

  • Versuche andere theme_* Funktionen. Z.B. theme_excel() oder theme_economist() aus dem ggthemes Paket.

F - Statistiken

  1. Mit der stat_summary() Funktion können auch direkt einfache Statistiken berechnet und geplotted werden. Verwende den folgenden Code um die Calories (y-Achse) gegen Categories zu plotten. Annotiere angemessen.
ggplot(XX, aes(x = XX, y = X)) +
  stat_summary(geom = "bar", 
               fun.y = "mean") +
  labs(title = "XX",
       subtitle = "XX")
ggplot(mcdonalds, aes(x = Category, y = Calories)) +
  stat_summary(geom = "bar", 
               fun.y = "mean") +
  labs(title = "Calories gegen McDonalds Menu Kategorie",
       subtitle = "Balken repräsentieren Mittelwwerte")

  1. Probiere ein paar Sachen aus:
  • Verwende den "median" anstatt "mean".
  • Gib jedem Balken eine andere Farbe.
  • Ergänze Punkte über den Balken mit geom_point(), geom_count(), oder geom_jitter().
ggplot(mcdonalds, aes(x = Category, 
                      y = Calories, 
                      col = Category)) +
  stat_summary(geom = "bar", 
               fun.y = "median") +
  geom_jitter() +
  labs(title = "Calories gegen McDonalds Menu Kategorie",
       subtitle = "Balken repräsentieren Mittelwwerte")

X - Challenges

  1. Kreiere deinen eigenen, neuen Plot mit dem mcdonalds Datensatz. Weitere geoms und alles weitere findest du hier

Beispiele

# Lade tidyverse
library(tidyverse)        

# Printe die mpg Daten
mpg 

# Beginne den Plot
ggplot(data = mpg)

# Ergänze das mapping, d.h. bestimme x und y
ggplot(data = mpg, 
       mapping = aes(x = displ, y = hwy))  

#  Ergänze Punkte
ggplot(data = mpg, 
       mapping = aes(x = displ, y = hwy)) +
       geom_point()     

# Ergänze nach Häufigkeit skalierte Punkte
ggplot(data = mpg, 
       mapping = aes(x = displ, y = hwy)) +
       geom_count()   

# Assigne class zum col Argument und füge labels mit labs() hinzu 
ggplot(data = mpg, 
  mapping = aes(x = displ, y = hwy, col = class)) +  
  geom_point(size = 3, position = 'jitter') +
  labs(x = "Hubraum in Litern",
       y = "Autobahn Meilen pro Gallone",
       title = "MPG Datensatz",
       subtitle = "Autos mit groesserem Hubraum fahren wneiger Meilen",
       caption = "Quelle: mpg Datensatz aus ggplot2")
  

# Ergänze eine Kurve für jede Klasse
ggplot(data = mpg, 
       mapping = aes(x = displ, 
                     y = hwy, 
                     color = class)) +
  geom_point(size = 3, alpha = .9) + 
  geom_smooth(method = "lm")

# Ergänze eine Kurve für alle Klassen zusammen
ggplot(data = mpg, 
       mapping = aes(x = displ, 
                     y = hwy, 
                     color = class)) +
  geom_point(size = 3, alpha = .9) + 
  geom_smooth(col = "blue", method = "lm")

# Kombination von verschiedenen Elementen
ggplot(data = mpg, 
       mapping = aes(x = cty, y = hwy)) + 
       geom_count(aes(color = manufacturer)) +    
       geom_smooth() +
       geom_text(data = filter(mpg, cty > 25), 
                 aes(x = cty,y = hwy, 
                     label = rownames(filter(mpg, cty > 25))),
                     position = position_nudge(y = -1), 
                                check_overlap = TRUE, 
                     size = 5) + 
  labs(x = "Hubraum in Litern",
       y = "Autobahn Meilen pro Gallone",
       title = "MPG Datensatz",
       subtitle = "Autos mit groesserem Hubraum fahren wneiger Meilen",
       caption = "Quelle: mpg Datensatz aus ggplot2")

Datensätze

library(tidyverse)
library(ggthemes)
mcdonalds <- read_csv("1_Data/mcdonalds.csv")
File Rows Columns
mcdonalds.csv 260 24

First 5 rows and columns of mcdonalds.csv

Category Item ServingSize Calories CaloriesfromFat
Breakfast Egg McMuffin 4.8 oz (136 g) 300 120
Breakfast Egg White Delight 4.8 oz (135 g) 250 70
Breakfast Sausage McMuffin 3.9 oz (111 g) 370 200
Breakfast Sausage McMuffin with Egg 5.7 oz (161 g) 450 250
Breakfast Sausage McMuffin with Egg Whites 5.7 oz (161 g) 400 210

Funktionen

Pakete

Paket Installation
tidyverse install.packages("tidyverse")
ggthemes install.packages("ggthemes")

Resourcen

Dokumentation

Siehe die ggplot2 Webseite und Selva Prabhakaran’s Webseite mit inspirierenden ggplot2 Beispielen.

Cheatsheet


from R Studio