Skip to content
Snippets Groups Projects
ggplot-advanced.Rmd 36.85 KiB
title: "Weiterführende Darstellungen in `ggplot2`"
output: 
  html_document:
      toc: true
      toc_float:
        toc_collapsed: true
        smooth_scroll: true
      toc_depth: 3
      widescreen: true
      highlightStyle: github
      highlightLines: true
      highlightLanguage: ["r"]
      css: ./styles/htmlbook.css
      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
      includes:
        after_body: ./styles/footer.html
        before_body: ./styles/header.html
library("knitr")
library("rmarkdown")
library("tidyverse")
library("naniar")
library("UpSetR")
library("dotwhisker")

pss <- readRDS("../datasets/pss.rds")
uniMis <- readRDS("../datasets/uniMis.rds")

opts_chunk$set(#fig.path = 'pics/s6-', # path for calculated figures
               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
               comment = "", # no hashtags before output
               results = "markdown",
               rows.print = 15
)
             
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()
)

Start

In diesem Teil des Kurses werden weiterführende Einstellungen innerhalb des Pakets ggplot2 dargestellt. Aufbauend auf die Einführung in die Grammatik von ggplot werden folgende Teile dargestellt:

  • Schriftarten bearbeiten bzw. Darstellung des Plots

  • Anmerkungen im Plot

  • missing values darstellen

  • Marginal Plots / Regressionsplots

  • Karten bearbeiten

Eine gute Übersicht bietet auch folgendes Online-Lernbuch (auf Englisch).

Weitere Layout-Fragen

Innerhalb eines ggplots können nahezu alle dargestellten Teilbereiche verändert und angepasst werden. Einige dieser Änderungen werden wie im nachfolgenden besprechen.

Dazu schaffen wir uns zuerst nochmal ein ggplot-Objekt mit unserem Scatterplot aus der Einführung in ggplot:

scatter <- ggplot(pss, 
                  aes(stfeco, 
                      stfdem
                      )
                  ) +  
  geom_jitter(alpha = .2, 
              col = "blue"
              ) +
  scale_x_continuous(breaks = seq(0, 
                                  10, 
                                  1
                                  )
                     ) +
  scale_y_continuous(breaks = seq(0, 
                                  10, 
                                  1
                                  )
                     )

scatter

Zuerst fügen wir nochmals Titel, Achsenbeschriftung und Quellen hinzu.

scatterLeg <- scatter +
  labs(x = "Satisfaction with Economy",
       y = "Satisfaction with Democracy",
       title = "Correlation Plot",
       caption = "Data: Panem Social Survey.\n Data jittered."
       )

scatterLeg

Innerhalb der Funktion theme() können wir Teilbereiche des Plots ansprechen und ändern. Dies umfasst u.a. folgende Eigenschaften des Plots:

  • plot.title
  • axis.title.x / axis.title.y
  • axis.text.x / axis.text.y
  • panel.grid / panel.grid.minor / panel.grid.major
  • plot.background / panel.background

Eine komplette Übersicht aller Einstellungen die in theme() genutzt werden können findet sich in der User-Dokumentation.

Wir werden jetzt nach und nach Veränderungen vornehmen. Zuerst werden wir die Schriftgröße, Position und das Erscheinungsbild des Titels ändern. Dies machen wir über plot.title in theme(). Dazu verwenden wir die Funktion element_text():

scatterLeg +
  theme(plot.title = element_text(size = 25,
                                  face = "italic",
                                  hjust = 0.5
                                  )
        )

Dazu haben wir die drei Argumente size (Schriftgröße), face (Erscheinungsbild) und hjust (Position) genutzt.

Als nächstes wollen wir die Achsentitel bearbeiten.

scatterAxes <- scatterLeg +
  theme(plot.title = element_text(size = 25,
                                  face = "italic",
                                  hjust = 0.5
                                  ),
        axis.title.x = element_text(size = 16, 
                                    color = "seagreen", 
                                    hjust = 0
                                    ),
        axis.title.y = element_text(size = 8, 
                                    color = rgb(0, 
                                                105, 
                                                179, 
                                                maxColorValue = 255
                                                ), 
                                    hjust = 1, 
                                    face = "bold"
                                    )
        )

scatterAxes

Anstatt eine Farbe anzugeben, kann man mit der Funktionrgb() auch den Farbton bestimmen. Alternativ kann man auch den HTML-Code der Farbe innerhalb des Arguments color nutzen.

scatterLeg +
  theme(plot.title = element_text(size = 25,
                                  face = "italic",
                                  hjust = 0.5
                                  ),
        axis.title.x = element_text(size = 16, 
                                    color = "seagreen", 
                                    hjust = 0
                                    ),
        axis.title.y = element_text(size = 8, 
                                    color = "#0069B3", 
                                    hjust = 1, 
                                    face = "bold"
                                    )
        )

Nun möchten wir weiter experimentieren und die Achsenticks bearbeiten. Dazu nutzen wir axis.ticks.x bzw. axis.ticks.y.

scatterTicks <- scatterAxes +
  theme(axis.text.x = element_text(size = 12, 
                                    angle = 45,
                                    color = "darkgrey"
                                   ),
        axis.text.y = element_text(size = 11, 
                                   hjust = 0,
                                   vjust = 1
                                   )
        )

scatterTicks

Mit dem Argument angle können wir die Achsenbeschriftungen drehen lassen. Mit hjust und vjust können wir die Startposition des Texts ändern.

Als nächstes möchten wir das Grid des Plots ändern, also die Linien. Dazu nutzen wir erstmal das Argument panel.grid und innerhalb des Arguments die Funktion element_line()

scatterGrid <- scatterTicks +
  theme(panel.grid = element_line(color = "green",
                                  size = 1,
                                  linetype = "solid" # blank, solid, dashed, dotted, dotdash, longdash, twodash 
                                  )
        )

scatterGrid

Mit den Argumenten panel.grid.major und panel.grid.minor können die Haupt- und Hilfslinien getrennt bearbeitet werden. Wenn wir zum Beispiel nur die Hauptlinien wollen, machen wir folgendes:

scatterGrid <- scatterTicks +
  theme(panel.grid.major = element_line(color = "green",
                                        size = 1,
                                        linetype = "solid" # blank, solid, dashed, dotted, dotdash, longdash, twodash 
                                        ),
        panel.grid.minor = element_blank()
        )

scatterGrid

Man kann auch die Hilfslinien getrennt nach Achsen bearbeiten. Dazu muss man einfach jeweils .x bzw. .y beifügen.

Zuletzt kann man noch den Hintergrund des Plots bzw. des Panels ändern. Dies geschieht über die Argumente plot.background bzw. panel.background. Dazu nutzt man die Funktion element_rect() innerhalb des Arguments

scatterGrid +
  theme(plot.background = element_rect(color ="darkgray",
                                       size = 2,
                                       fill = "lightpink"
                                       ),
        panel.background = element_rect(fill = "moccasin"
                                        )
        )

Es gibt ebenso eine ganze Reihe an vorgefertigten Themes, die dann wiederum individuell angepasst werden können. Eine Übersicht über vorhandene Themes gibt es hier.

Annotations

Neben den ganzen Spielereien möchte man manchmal auch einzelne Bereiche einer Grafik besonders hervorheben oder aber zum Beispiel Beschriftungen der Fälle hinzufügen (bei kleinem n).

Hierzu gibt es die Funktionen geom_text() und annotate(), die mit ggplot genutzt werden können. Dazu nehmen wir wieder das Scatterplot vom Beginn, begrenzen aber diesmal die Anzahl auf 15, damit wir eine klare Darstellung bekommen. Wichtig: geom_jitter() kann nicht genutzt werden, da die Datenbeschriftungen am Datenpunkt und nicht am gejitterten Datenpunkt auftauchen!

scatter2 <- ggplot(pss[1:15,], 
                  aes(stfeco, 
                      stfdem
                      )
                  ) +  
  geom_point(col = "blue") +
  scale_x_continuous(breaks = seq(0, 
                                  10,
                                  1
                                  )
                     ) +
  scale_y_continuous(breaks = seq(0, 
                                  10, 
                                  1
                                  )
                     )

scatter2

Mit der Funktion geom_text() kann man den Datenpunkten-Beschriftungen hinzufügen. So zum Beispiel die Zeilennummer oder die ID-Variable. Wir machen letzteres, da sich die Zeilennummer bei Sortierungen ändern kann und somit nicht eindeutig ist. Daher fügen wir jetzt mit der Funktion in aes ein label hinzu (idno).

scatter2 +
  geom_text(aes(label = idno))

Innerhalb von geom_text() kann man nun weitere Einstellungen vornehmen. Ein paar davon kennen wir schon, zwei weitere wichtige sind nudge_y und nudge_x, die den Schriftstart auf der jeweiligen Achse verschieben.