Skip to content
Snippets Groups Projects
ggplot-grammar.Rmd 19.3 KiB
Newer Older
  • Learn to ignore specific revisions
  • bpkleer's avatar
    bpkleer committed
    ---
    title: "Einführung in ggplot2-Grammatik"
    subtitle: "Daten bändigen & visualisieren"
    author: "B. Philipp Kleer"
    date: "11. Oktober 2021"
    output: 
      slidy_presentation:
          footer: "CC BY-SA 4.0, B. Philipp Kleer"
          widescreen: true
          highlight: pygments
          theme: readable
    
    bpkleer's avatar
    bpkleer committed
          css: ./styles/style-slides.css
    
    bpkleer's avatar
    bpkleer committed
          df_print: paged
          mathjax: default
          self_contained: false
          incremental: false #True  dann jedes Bullet einzeln
          collapse: true # means the text output will be merged into the R source code block
    ---
    
    ```{r setup, include=FALSE}
    library("knitr")
    library("rmarkdown")
    library("tidyverse")
    
    
    bpkleer's avatar
    bpkleer committed
    pss <- readRDS("../datasets/pss.rds")
    
    bpkleer's avatar
    bpkleer committed
    
    
    bpkleer's avatar
    bpkleer committed
    opts_chunk$set(#fig.path = 'pics/s6-', # path for calculated figures
    
    bpkleer's avatar
    bpkleer committed
                   fig.align = 'center',  # alignment of figure (also possible right, left, default)
                   fig.show = 'hold', # how to show figures: hold -> direct at the end of code chunk; animate: all plots in an animation
                   fig.width = 6,   # figure width
                   fig.height = 6,  # figure height
                   echo = TRUE,     # Code is printed
                   eval = FALSE,    # Code is NOT evaluated
                   warning = FALSE, # warnings are NOT displayed
                   message = FALSE, # messages are NOT displayed
                   size = "tiny",  # latex-size of code chunks
                   background = "#E7E7E7", # background color of code chunks
                   comment = "", # no hashtags before output
                   options(width = 80),
                   results = "markdown",
                   rows.print = 15
    )
    
    
    bpkleer's avatar
    bpkleer committed
    htmltools::tagList(
      xaringanExtra::use_clipboard(
        button_text = "<i class=\"fa fa-clipboard\"></i>",
        success_text = "<i class=\"fa fa-check\" style=\"color: #90BE6D\"></i>",
        error_text = "<i class=\"fa fa-times-circle\" style=\"color: #F94144\"></i>"
      ),
      rmarkdown::html_dependency_font_awesome()
    )
    
    
    bpkleer's avatar
    bpkleer committed
    ```
    
    ## Starten wir!
    Nun tauchen wir in die Welt von **ggplot2** ein. Das Paket ist **das** Grafik-Paket in R. Viele weitere Grafikpakete beruhen auf derselben Grammatik wie **ggplot2**, so dass Kenntnisse dieses Pakets jedem helfen. 
    
    Auch hier laden wir zuerst **tidyverse** bzw. installieren es, wenn es noch nicht installiert ist:
    
    ``` {r install-tidy}
    # install.packages("tidyverse")
    library("tidyverse")
    
    # alternativ: 
    # install.packages("ggplot2")
    # library("ggplot2")
    ```
    
    Anschließend laden wir den Datensatz ```pss``` ins *environment*.
    
    ``` {r uni-load}
    
    bpkleer's avatar
    bpkleer committed
    pss <- readRDS("../datasets/pss.rds") #oder eigener Pfad, wenn nicht in Cloud
    
    bpkleer's avatar
    bpkleer committed
    ```
    
    Wir machen **gplot2** ist sehr umfangreich, wir machen heute einen Einstieg in die Grammatik. Da die Grafiken aber als Layer aufgebaut sind, können mithilfe des Verständnisses der Grafikgrammatik auch aufwendigere Grafiken erstellt werden. 
    
    Einen Überblick, was wir heute machen:
    
    1. Balkendiagramme und Grundaufbau von ggplot
    
    2. Histogramme
    
    3. Scatterplots
    
    4. Gruppierungen
    
    ## Balkendiagramme
    Ein Balkendiagramm ist ein Plot einer einzelnen kategorialen Variable. Es gibt zwei Wege eine Grafik mit **ggplot2** zu erstellen: einmal als direkte Ausgabe und einmal als Objekt zu speichern. Vorteil von letzterem ist, dass man dann am gespeicherten Plot Anpassungen vornehmen kann ohne den ganzen vorherigen Code nochmals ausführen lassen zu müssen.
    
    ``` {r ggplot1, eval=TRUE}
    # direkter Output
    ggplot(data = pss,
    
    bpkleer's avatar
    bpkleer committed
           mapping = aes(x = edu)
           )
    
    bpkleer's avatar
    bpkleer committed
    ```
    
    
    ``` {r ggplot2, eval=TRUE}
    # oder speichern als Objekt
    mfPlot <- ggplot(data = pss,
    
    bpkleer's avatar
    bpkleer committed
                     mapping = aes(x = edu)
                     )
    
    bpkleer's avatar
    bpkleer committed
    mfPlot
    ```
    
    Aber warum sind beide Plots leer?
    
    ## ggplot() verstehen
    Wir haben nur das Grundgerüst mit der Funktion **ggplot()** übergeben. Diese Funktion beinhaltet immer die Daten (in ```data```) und die Struktur des Plots (```mapping```). Ein Balkendiagramm ist eine univariate Darstellung und deshalb übergeben wir nur eine Variable (hier ```edu```). 
    
    Um nun ein Balkendiagramm aus dem Plot zu machen, benötigen wir einen weiteren Layer, der eben ein Balkendiagramm ausgibt. Dies ist der Zusatz ```geom_bar()```.
    
    ``` {r bar, eval=TRUE}
    ggplot(data = pss,
    
    bpkleer's avatar
    bpkleer committed
           mapping = aes(x = edu)
           ) +
    
    bpkleer's avatar
    bpkleer committed
      geom_bar()
    
    # oder:
    # mfPlot + 
    #   geom_bar()
    ```
    
    Jetzt haben wir ein Balkendiagramm mit Häufigkeiten. Manchmal möchte man lieber Prozente:
    ``` {r bar2, eval=TRUE}
    ggplot(data = pss, 
           mapping = aes(x = edu, 
                         y = ..prop..,  #Einstellung Prozente
    
    bpkleer's avatar
    bpkleer committed
                         group = 1   # Einstellung nur eine Gruppe, sonst wäre jeder Balken 100 %
                         )
           ) + 
    
    bpkleer's avatar
    bpkleer committed
      geom_bar()
    ```
    
    Alternativ können wir das Diagramm auch zu einem tatsächlichen Balkendiagramm machen und die Säulen loswerden:
    ``` {r bar3, eval=TRUE}
    mfPlot +
      geom_bar() +
      coord_flip()
    ```
    
    ## Bringen wir Farbe ins Spiel!
    In der Regel wollen wir Grafiken ansprechend gestalten, dafür gibt es verschiedene Argumente in **ggplot()**. Die zwei wichtigsten sind ```color``` und ```fill```. Probieren wir es einfach mal der Reihe nach aus. Wir wollen, dass die Balken jetzt jeweils eine andere Farbe haben.
    
    ``` {r bar4, eval=TRUE}
    eduPlot <- ggplot(pss, 
                      aes(edu, 
    
    bpkleer's avatar
    bpkleer committed
                          color = edu
                          )
                      ) +
    
    bpkleer's avatar
    bpkleer committed
      geom_bar()
    eduPlot
    ```
    
    ```color``` macht also hier nur die Randlinie, nicht aber die Fläche der Balken farbig. Mit ```fill``` können wir das beheben.
    
    ```{r bar5, eval=TRUE}
    eduPlot <- ggplot(pss, 
                      aes(edu, 
    
    bpkleer's avatar
    bpkleer committed
                          fill = edu
                          )
                      ) +
    
    bpkleer's avatar
    bpkleer committed
      geom_bar()
    eduPlot
    
    ```
    
    Wenn man eigene Farben benennen will, kann man dies in der Unterfunktion ```geom_bar()```. Es empfiehlt sich vorab einen Farbvektor zu definieren:
    ``` {r bar6, eval=TRUE}
    cntryCol = c("steelblue", 
                  "seagreen", 
                  "red4", 
                  "orange",
                  "pink",
    
    bpkleer's avatar
    bpkleer committed
                  "lightgray"
                 )
    
    bpkleer's avatar
    bpkleer committed
    
    ggplot(pss, 
           aes(x = edu, 
    
    bpkleer's avatar
    bpkleer committed
               fill = edu
               )
           ) +
    
    bpkleer's avatar
    bpkleer committed
       geom_bar(fill = cntryCol) 
    ```
    
    Neben dieser Möglichkeit können auch Farbpaletten genutzt werden, die eine beliebige Anzahl an Farben inkludieren. **Wichtig:** Sind in der Farbpalette weniger Farben definiert, gibt es einen Fehler. Es müssen mindestens so viele Farben vorhanden sein, wie die Variable Kategorien hat. Hierzu fügt man einen weiteren Layer ```scale_fill_manual()``` bzw. ```scale_fill_color()``` hinzu. 
    
    ``` {r bar7, eval=TRUE}
    # a colourblind-friendly palettes
    
    bpkleer's avatar
    bpkleer committed
    cbp1 <- c("#999999", 
              "#E69F00",
              "#56B4E9",
              "#009E73",
              "#F0E442",
              "#0072B2",
              "#D55E00",
              "#CC79A7"
              )
    
    bpkleer's avatar
    bpkleer committed
    
    eduPlotCb<- ggplot(pss, 
                       aes(edu, 
    
    bpkleer's avatar
    bpkleer committed
                           fill = edu
                           )
                       ) + 
    
    bpkleer's avatar
    bpkleer committed
      geom_bar() +
      scale_fill_manual(values = cbp1)
    
    bpkleer's avatar
    bpkleer committed
    
    
    bpkleer's avatar
    bpkleer committed
    eduPlotCb
    ```
    
    Für einen kostensparenden Druck kann man auch einfach direkt ```scale_fill_gray()``` nutzen:
    ``` {r bar8, eval=TRUE}
    ggplot(pss, 
           aes(district, 
    
    bpkleer's avatar
    bpkleer committed
               fill = district
               )
           ) + 
    
    bpkleer's avatar
    bpkleer committed
      geom_bar() +
      scale_fill_grey()
    ```
    Alternativ kann man auch verschiedene vorgefertigte Farbpaletten nutzen. Dazu muss man oftmals das entsprechenden Paket laden und dann gibt es eine dazugehörige Funktion, die als zusätzlicher Layer festgelegt wird. 
    
    Ein solche Paket ist zum Beispiel ```RColorBrewer```:
    ``` {r brewer, eval=TRUE}
    # if(!require("RColorBrewer")) install.packages("RColorBrewer")
    library("RColorBrewer")
    
    bpkleer's avatar
    bpkleer committed
    
    
    bpkleer's avatar
    bpkleer committed
    display.brewer.all()
    ```
    
    Die einzelnen Farbpaletten können, dann wie folgt hinzugefügt werden:
    ``` {r brewer2, eval=TRUE}
    eduPlot +
      scale_fill_brewer(palette = "Dark2")
    ```
    
    
    ## Achsen anpassen
    Als nächsten Schritt passen wir die Achsen an, da die Standardeinstellungen dafür meistens nicht schön sind. Hierfür gibt es folgende Funktionen:
    
    - ```coord_cartesian()``` (Achsengrenzen festlegen)
    - ```scale_x_continuous()```/```scale_y_continuous()``` (für numerische Vektoren)
    - ```scale_x_discrete()```/```scale_y_discrete()``` (für Faktoren oder Character-Variablen)
    
    Was ist mit unseren Achsen?
    ``` {r axes, eval=TRUE}
    eduPlot2 <- eduPlot + 
    
    bpkleer's avatar
    bpkleer committed
      coord_cartesian(ylim = c(0,
                               1500
                               )
                      ) +
    
    bpkleer's avatar
    bpkleer committed
      scale_y_continuous(breaks = seq(0, 
                                      1500, 
    
    bpkleer's avatar
    bpkleer committed
                                      100
                                      )
                         )
    
    bpkleer's avatar
    bpkleer committed
    eduPlot2
    ```
    
    Die x-Achse ist kategoriell und daher macht eine metrische Aufteilung keinen Sinn. Mit ```scale_x_discrete()``` können wir aber die limits festsetzen:
    ``` {r axes2, eval=TRUE}
    eduPlot3 <- eduPlot2 + 
      scale_x_discrete(limits = c("ES-ISCED I", 
                                  "ES-ISCED II", 
                                  "ES-ISCED III", 
                                  "ES-ISCED IV",
    
    bpkleer's avatar
    bpkleer committed
                                  "ES-ISCED V"
                                  )
                       )
    
    
    bpkleer's avatar
    bpkleer committed
    eduPlot3
    ```
    
    Was haben wir ausgelassen?
    
    ## Titel, Caption, Legende und weitere Infos
    Wir können eine Reihe an Achsenbeschriftungen hinzufügen. Dies geschieht am einfachsten über die Funktion ```labs()```. Darin gibt es folgende Unterargumente:
    
    - ```xlab```: x-Achsentitel
    - ```ylab```: y-Achsentitel
    - ```title```: Titel
    - ```caption```: Fußnote/Caption
    
    ``` {r text1, eval=TRUE}
    eduPlot4 <- eduPlot3 +
      labs(x = "Education level",
           y = "Frequency",
           title = "my first shot at ggplot2",
    
    bpkleer's avatar
    bpkleer committed
           caption = "Data: Panem Social Survey."
           )
    
    
    bpkleer's avatar
    bpkleer committed
    eduPlot4
    ```
    
    Das schaut schon soweit gut aus, jetzt wollen wir nur noch die Legende anpassen, so dass auch dort ein angepasster Titel steht. Dies machen wir in der Funktion ```scale_fill_manual()```, die wir zuvor schon genutzt haben. Wir überschreiben sozusagen die Angaben:
    
    ``` {r legend1, eval=TRUE}
    
    bpkleer's avatar
    bpkleer committed
    eduPlot5 <- eduPlot4 +
    
    bpkleer's avatar
    bpkleer committed
      scale_fill_manual(values = cbp1,
                        name = "Education category",
                        labels = c("sehr niedrig",
                                   "niedrig", 
                                   "mittel",
                                   "hoch",
    
    bpkleer's avatar
    bpkleer committed
                                   "sehr hoch"
                                   )
                        )
    
    bpkleer's avatar
    bpkleer committed
    
    
    bpkleer's avatar
    bpkleer committed
    eduPlot5
    
    bpkleer's avatar
    bpkleer committed
    ```
    
    Über die Funktion ```theme()``` können viele Feineinstellungen vorgenommen werden. Diese können wir nicht im einzelnen hier besprechen, aber es kann wirklich jedes Detail eingestellt werden. Mehr dazu machen die Personen, die am Nachmittag nochmal vertieft mit **ggplot()** arbeiten. 
    
    
    ## Histogramme
    Gehen wir nun über zu Histogrammen. Diese nutzen wir für metrische Variablen. Hierfür nutzen wir den Layer ```geom_histogram()```.
    
    ``` {r hist1, eval=TRUE}
    agePlot <- ggplot(pss,
    
    bpkleer's avatar
    bpkleer committed
                      aes(agea)
                      ) + 
    
    bpkleer's avatar
    bpkleer committed
      geom_histogram()  
    
    bpkleer's avatar
    bpkleer committed
    
    
    bpkleer's avatar
    bpkleer committed
    agePlot
    ```
    
    Auch hier können wir ganz einfach Anpassungen von oben übernehmen und den Plot schöner gestalten:
    ``` {r hist2, eval=TRUE}
    agePlot2 <- agePlot +
      geom_histogram(color = "lightgray", 
    
    bpkleer's avatar
    bpkleer committed
                     fill = "gray"
                     ) + 
    
    bpkleer's avatar
    bpkleer committed
      labs(x = "Age in years", 
           y = "Frequency", 
    
    bpkleer's avatar
    bpkleer committed
           title = "Histogram of Age (PSS)"
           )
    
    
    bpkleer's avatar
    bpkleer committed
    agePlot2
    ```
    
    Oftmals fügen wir auch die Dichte hinzu, um einfacher beurteilen zu können, ob annähernd eine Normalverteilung vorliegt. Hierzu bestimmen wir, dass die y-Achse die Dichte anzeig (```y = ..density..```) und fügen ```geom_density()``` hinzu. Mit ```alpha``` stellen wir Durchsichtigkeit ein und mit ```fill``` die Farbe der Fläche. 
    ``` {r hist3, eval=TRUE}
    ageDensPlot <- ggplot(pss, 
    
    bpkleer's avatar
    bpkleer committed
                          aes(agea)
                          ) + 
    
    bpkleer's avatar
    bpkleer committed
      geom_histogram(aes(y = ..density..), 
                     color = "lightgray", 
    
    bpkleer's avatar
    bpkleer committed
                     fill = "gray"
                     ) + 
    
    bpkleer's avatar
    bpkleer committed
      geom_density(alpha = 0.2, 
    
    bpkleer's avatar
    bpkleer committed
                   fill = "lightblue"
                   ) +
    
    bpkleer's avatar
    bpkleer committed
      labs(x = "Age in years", 
           y = "Density", 
    
    bpkleer's avatar
    bpkleer committed
           title = "Histogram of Age (PSS)"
           )
    
    
    bpkleer's avatar
    bpkleer committed
    ageDensPlot
    ```
    
    ```geom_histogram()``` wählt automatisch die Breite der ```bin``` (Säulen), was irreführend sein kann. Hier könnten wir zum Beispiel so einstellen, dass wir so viele ```bins``` erhalten, wie es auch tatsächliche Alterskategorien gibt. Man kann einfach die Breite der ```bins``` mit ```binwidth()``` festlegen. Hier wählen wir den realen Abstand zwischen zwei Einträgen in dem Vektor/Variable (hier 1).
    ```{r hist5, eval=TRUE}
    ggplot(pss, 
    
    bpkleer's avatar
    bpkleer committed
           aes(agea)
           ) + 
    
    bpkleer's avatar
    bpkleer committed
      geom_histogram(aes(y = ..density..), 
                     color = "lightgray", 
                     fill = "gray",
    
    bpkleer's avatar
    bpkleer committed
                     binwidth = 1
                     ) + 
    
    bpkleer's avatar
    bpkleer committed
      geom_density(alpha = 0.2, 
    
    bpkleer's avatar
    bpkleer committed
                   fill = "lightblue"
                   ) +
    
    bpkleer's avatar
    bpkleer committed
      labs(x = "Age in years", 
           y = "Density", 
    
    bpkleer's avatar
    bpkleer committed
           title = "Histogram of Age (PSS)"
           )
    
    bpkleer's avatar
    bpkleer committed
    
    ```
    
    ## Scatterplots
    Oftmals wollen wir zwei Variablen darstellen und ihren Zusammenhang. So könnten wir uns zum Beispiel für den Zusammenhang zwischen der Zufriedenheit mit dem demkoratischen System (```stfdem```) und der Zufriedenheit mit der ökonomischen Entwicklung (```stfeco```) anschauen. Dies sind beides Variablen auf pseudometrischen Niveau gemessen, in R aber als numerische Variablen hinterlegt. 
    
    Um Scatterplots darzustellen nutzen wir ```geom_point()```. Wir geben jetzt zwei Variablen in ```aes()``` an. Einmal die x-Achsenvariable und dann die y-Achsenvariable.
    
    ```{r scatter1, eval=TRUE}
    scatter1 <- ggplot(pss, 
                       aes(stfeco, 
    
    bpkleer's avatar
    bpkleer committed
                           stfdem
                           )
                       ) + 
    
    bpkleer's avatar
    bpkleer committed
       geom_point()
    
    bpkleer's avatar
    bpkleer committed
    
    
    bpkleer's avatar
    bpkleer committed
    scatter1
    ```
    
    Warum sehen wir nun so wenige Punkte, obwohl der Datensatz $5000$ Fälle hat?
    
    ## Scatterplot pseudometrische Variablen
    Um pseudo-metrische Variablen korrekt darzustellen, benötigen wir ```geom_jitter()```, da die Datenpunkte sonst übereinanderlappen. **Wichtig:** Das jittern sollte angegeben werden, damit kein falscher Dateneindruck entsteht!
    
    ``` {r scatter2, eval=TRUE}
    scatter2 <- ggplot(pss, 
                       aes(stfeco, 
    
    bpkleer's avatar
    bpkleer committed
                           stfdem
                           )
                       ) +
    
    bpkleer's avatar
    bpkleer committed
       geom_jitter(width = 0.3,
    
    bpkleer's avatar
    bpkleer committed
                   height = 0.3
                   ) +
    
    bpkleer's avatar
    bpkleer committed
      labs(x = "Satisfaction with Economy",
           y = "Satisfaction with Democracy",
    
    bpkleer's avatar
    bpkleer committed
           caption = "Data jittered."
           )
    
    
    bpkleer's avatar
    bpkleer committed
    scatter2
    ```
    
    Weitergehend können wir mit ```alpha``` in ```geom_jitter()``` (oder auch in ```geom_point()```) einen besseren Eindruck verstärken. Datenkombinationen die weniger oft vorkommen erscheinen nciht so kräftig:
    
    ``` {r scatter3, eval=TRUE}
    ggplot(pss, 
           aes(stfeco, 
    
    bpkleer's avatar
    bpkleer committed
               stfdem
               )
           ) +  
    
    bpkleer's avatar
    bpkleer committed
      geom_jitter(alpha = .2, 
    
    bpkleer's avatar
    bpkleer committed
                  col = "blue"
                  )
    
    bpkleer's avatar
    bpkleer committed
    ``` 
    
    
    bpkleer's avatar
    bpkleer committed
    Als weitere Argumente können sowohl in ```geom_jitter()``` als auch in ```geom_point()``` mit ```shape``` das Erscheinungsbild geändert werden. Das Cheat Sheet findet man [hier](https://github.com/rstudio/cheatsheets/raw/master/data-visualization.pdf).
    
    bpkleer's avatar
    bpkleer committed
    
    ## Gruppierungen
    Oftmals möchte man eine Variable oder den Zusammenhang zweier Variablen getrennt nach einer kategoriellen Variable einblicken. Dazu gibt es in **ggplot2** verschiedene Möglichkeiten. Ein paar davon werde ich kurz vorstellen:
    
    - Balkendiagramm: ```fill```, ```color``` und ```facets```
    
    - Scatterplots: ```shape``` und ```facets```
    
    ### Balkendiagramme
    Wir möchten gerne wissen, wie viele Befragte in den fünf ausgewählten Distrikten weiblich bzw. männlich sind. Dies können wir einfach erhalten, in dem wir in ```ggplot()``` mit ```fill``` eine Aufteilung nach Geschlecht hinzufügen. Das funktioniert auch analog mit ```color``` (nur ist es etwas unübersichtlich bei Balkendiagrammen).
    
    ```{r bargroup, eval=TRUE}
    barg <- ggplot(pss, 
                   aes(district, 
    
    bpkleer's avatar
    bpkleer committed
                       fill = gndr
                       )
                   ) +
    
    bpkleer's avatar
    bpkleer committed
      geom_bar()
    
    bpkleer's avatar
    bpkleer committed
    
    
    bpkleer's avatar
    bpkleer committed
    barg
    ```
    
    Will man dies nun etwas übersichtlicher nebeneinander haben, geschieht dies einfach mit dem Argument ```position``` in ```geom_bar()```:
    ```{r barg2, eval=TRUE}
    barg2 <- ggplot(pss, 
                   aes(district, 
    
    bpkleer's avatar
    bpkleer committed
                       fill = gndr
                       )
                   ) +
    
    bpkleer's avatar
    bpkleer committed
      geom_bar(position = position_dodge())
    
    bpkleer's avatar
    bpkleer committed
    
    
    bpkleer's avatar
    bpkleer committed
    barg2
    ```
    
    Alternativ kann man ```facets``` innerhalb eines **ggplots** erstellen. Dies geht entweder mit ```facet_wrap()``` oder mit ```facet_grid```:
    
    ``` {r facet1, eval=TRUE}
    barg2 <- ggplot(pss, 
                   aes(district, 
    
    bpkleer's avatar
    bpkleer committed
                       fill = gndr
                       )
                   ) +
    
    bpkleer's avatar
    bpkleer committed
      geom_bar() +
    
    bpkleer's avatar
    bpkleer committed
      facet_wrap(vars(gndr))
    
    bpkleer's avatar
    bpkleer committed
    
    
    bpkleer's avatar
    bpkleer committed
    barg2
    ```
    
    bpkleer's avatar
    bpkleer committed
    
    
    bpkleer's avatar
    bpkleer committed
    ### Scatterplots
    Bei Scatteprlots kann man ebenfalls mit ```shape``` arbeiten oder auch direkt ```facet_wrap```/```facet_grid``` benutzen.
    
    bpkleer's avatar
    bpkleer committed
    
    
    bpkleer's avatar
    bpkleer committed
    Wir möchten nun das Scatterplot von vorher nach Distrikten ausgeben lassen. Dazu können wir zuerst den Distrikten verschiedene Formen zuordnen. Dazu geben wir innerhalb von ```aes()``` einfach an, dass die Form (```shape```) in Abhängigkeit der Variable ```district``` ausgegeben werden soll.
    
    ``` {r scatter-shapes, eval=TRUE}
    ggplot(pss, 
           aes(stfeco, 
               stfdem,
    
    bpkleer's avatar
    bpkleer committed
               shape = district
               )
           ) +  
    
    bpkleer's avatar
    bpkleer committed
      geom_jitter(alpha = .2, 
    
    bpkleer's avatar
    bpkleer committed
                  col = "blue"
                  )
    
    bpkleer's avatar
    bpkleer committed
    ```
    
    Das ist jetzt noch nicht ganz so übersichtlich. Jetzt könnte man noch zusätzlich die Farbe in Abhängigkeit des Distrikts ändern. Dazu nutzt man das ```color```-Argument in ```aes()``` und entfernt es aus ```geom_jitter()```. Lässt man das ```color```-Argument in ```geom_jitter()``` bestehen, wird dies als zuletzt definierte Einstellung verwendet und alles bleibt blau.
    
    ``` {r scatter-color, eval=TRUE}
    ggplot(pss, 
           aes(stfeco, 
               stfdem,
               shape = district,
    
    bpkleer's avatar
    bpkleer committed
               color = district
               )
           ) +  
    
    bpkleer's avatar
    bpkleer committed
      geom_jitter(alpha = .2)
    ```
    
    Die Abbildung ist zwar jetzt schön bunt, aber so richtig einen guten Überblick gibt auch diese Darstellung noch nicht. Um das zu erreichen, nutzt man ```facets```. Der Unterschied zwischen den zwei möglichen ```facets``` ist folgender: Bei ```facet_wrap()``` wird aus einer eigentlich eindimensionalen Darstellung eine zweidimensionalen Darstellung gemacht und dementsprechend mehrere Abbildungen erstellt. Wenn man zum Beispiel eine kategoriale Variable hat, nach der man die Darstellung splitten möchte, ist ```facet_wrap()``` die richtige Wahl. Mit den Argumenten ```nrow``` und ```ncol``` kann man dazu die Anzahl der Zeilen und Spalten festlegen.
    ```facet_grid()``` dagegen ist zweidimensional. Hier wird ein Grafikpanel anhand von zwei Variablen erstellt, dass alle Kombinationen (auch die ohne Fälle) anzeigt. Dazu wird die Reihenfolge der Variablen auch wie in einer Formel angegeben, erst pro Zeile und dann pro Spalte.
    
    
    ``` {r scatter-facetwrap, eval=TRUE}
    ggplot(pss, 
           aes(stfeco, 
               stfdem,
               shape = district,
    
    bpkleer's avatar
    bpkleer committed
               color = district
               )
           ) +  
    
    bpkleer's avatar
    bpkleer committed
      geom_jitter(alpha = .2) +
      facet_wrap(vars(district))
    ```
    
    Wie oben beschrieben wird in ```facet_grid()``` ein tatsächlicher zweidimensionaler Plot erstellt. Dazu geben wir in der Funktion selbst an, über welche (kategorialen) Variablen der Plot geteilt werden soll. Die erste Variable ist die Trennung über Zeilen und die zweite Variable die Trennung über Spalten. Im Beispiel trennen wir in Zeilen nach Distrikt und in Spalten nach Geschlecht:
    ``` {r scatter-facetgrid, eval=TRUE}
    ggplot(pss, 
           aes(stfeco, 
               stfdem,
               shape = district,
    
    bpkleer's avatar
    bpkleer committed
               color = district
               )
           ) +  
    
    bpkleer's avatar
    bpkleer committed
      geom_jitter(alpha = .2) +
      facet_grid(district ~ gndr)
    ```
    
    ## Was es noch zu entdecken gibt in ```ggplot2```?
    
    - Schriftarten bearbeiten bzw. Darstellung des Plots
    
    - *missing values* darstellen
    
    - Marginal Plots
    
    - bivariate Normalverteilungen
    
    bpkleer's avatar
    bpkleer committed
    
    - Karten bearbeiten
    
    
    bpkleer's avatar
    bpkleer committed
    - Zusammenfügen von Plots
    
    ### Lab
    Die Übungsaufgaben findet ihr als ```task ggplot``` in RStudio Cloud.