HOWTO · R

Gruppierte Boxplots in R erstellen

In diesem Artikel erfahren Sie, wie Sie gruppierte Boxplots in R erstellen.

Auf dieser Seite

Ein gruppierter Boxplot in ggplot2 läuft auf eine Entscheidung hinaus: welche Variable die Daten in die Gruppen aufteilen soll, die Sie vergleichen möchten. Sie können diese Variable der fill-Ästhetik zuordnen, damit geom_boxplot() innerhalb jeder x-Position nebeneinanderliegende Boxen zeichnet, oder Sie können die Daten mit facet_wrap() in separate Panels aufteilen. Die folgenden Beispiele verwenden den Datensatz gapminder zusammen mit dem Paket dplyr, und jede Methode erzeugt einen gruppierten Boxplot, den Sie an Ihre eigenen Spalten anpassen können.

Erstellen eines gruppierten Boxplots mit geom_boxplot()

Die Funktion ggplot wird zusammen mit geom_boxplot im Allgemeinen verwendet, um Boxplot-Objekte zu erstellen. Das erste Argument von ggplot ist der Datensatz, das zweite die Liste der mit aes erzeugten ästhetischen Zuordnungen. In den Zuordnungen unten verweisen x und y auf die Spalten continent und lifeExp von gapminder, gefiltert auf drei ausgewählte Jahre mit dplyr-Funktionen.

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

if (requireNamespace("ggplot2", quietly = TRUE) &&
    requireNamespace("gapminder", quietly = TRUE) &&
    requireNamespace("dplyr", quietly = TRUE)) {
  library(ggplot2)
  library(gapminder)
  library(dplyr)

  dat <- gapminder %>%
    filter(year %in% c(1972, 1992, 2007))

  print(ggplot(dat, aes(x = continent, y = lifeExp)) +
    geom_boxplot() +
    scale_y_continuous(name = "Average Life Expectancy") +
    scale_x_discrete(labels = abbreviate, name = "Continent"))
}

Dieser Aufruf zeichnet eine Box pro Kontinent. Die Gruppierung nach der x-Variablen ist bereits gegeben, doch die Jahre innerhalb jedes Kontinents sind noch zusammengefasst. Der nächste Schritt besteht darin, die zweite Gruppierungsvariable hinzuzufügen. Die requireNamespace-Absicherung sorgt dafür, dass das Skript sauber beendet wird, wenn die Plot-Pakete nicht installiert sind; das Zeichnen wird in diesem Fall übersprungen. Behandeln Sie den Code daher als Syntax-Illustration und orientieren Sie sich an den gerenderten Abbildungen weiter unten im Artikel.

Gruppieren von Boxen mit der fill-Ästhetik

Wenn Sie eine Spalte der Ästhetik fill zuordnen, weisen Sie geom_boxplot an, für jede ihrer Gruppen innerhalb jeder x-Position eine eigene Box zu zeichnen. Es gibt jedoch einen Haken: fill erzeugt nur dann getrennte Gruppen, wenn die zugeordnete Variable diskret ist. Die Spalte year in gapminder ist numerisch, sodass fill = year als kontinuierlicher Farbverlauf behandelt wird und der Plot nicht in jährliche Boxen aufgeteilt wird. Wenn Sie sie in factor einschließen, werden die Zahlen in kategoriale Stufen umgewandelt, wodurch die beabsichtigten nebeneinanderliegenden Boxen entstehen. Den Unterschied sehen Sie in reinem R:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

year <- c(1972, 1992, 2007)

print(class(year))
print(class(factor(year)))
print(levels(factor(year)))
[1] "numeric"
[1] "factor"
[1] "1972" "1992" "2007"

Ein numerisches year bleibt ein kontinuierlicher Wert, während factor(year) benannte Stufen trägt – und fill fächert nur für die zweite Form in getrennte Boxen auf. In ggplot2 entscheidet derselbe Unterschied über das Layout:

if (requireNamespace("ggplot2", quietly = TRUE) &&
    requireNamespace("gridExtra", quietly = TRUE) &&
    requireNamespace("gapminder", quietly = TRUE) &&
    requireNamespace("dplyr", quietly = TRUE)) {
  library(ggplot2)
  library(gridExtra)
  library(gapminder)
  library(dplyr)

  dat <- gapminder %>%
    filter(year %in% c(1972, 1992, 2007))

  p1 <- ggplot(dat, aes(x = continent, y = lifeExp, fill = year)) +
    geom_boxplot() +
    scale_y_continuous(name = "Average Life Expectancy") +
    scale_x_discrete(labels = abbreviate, name = "Continent")

  p2 <- ggplot(dat, aes(x = continent, y = lifeExp, fill = factor(year))) +
    geom_boxplot() +
    scale_y_continuous(name = "Average Life Expectancy") +
    scale_x_discrete(labels = abbreviate, name = "Continent")

  grid.arrange(p1, p2, nrow = 2)
}

Gruppierte Boxplots, die ein kontinuierliches year-fill mit einem factor(year)-fill vergleichen, wobei nur die factor-Version getrennte Boxen zeichnet

Das obere Panel belässt year numerisch und bleibt ungruppiert, während das untere Panel factor(year) verwendet und drei Boxen pro Kontinent zeigt – eine für jedes ausgewählte Jahr.

Aufteilen von Gruppen in Panels mit facet_wrap()

Die Funktion facet_wrap ist eine weitere Möglichkeit, Boxplots zu zeichnen, die nach einer gewählten Variable gruppiert sind. Hier erzeugt sie ein Panel pro Jahr. facet_wrap funktioniert ohne eine fill-Zuordnung, doch das Beibehalten von fill = factor(year) färbt die Boxen ein, sodass sich die Panels leichter unterscheiden lassen.

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

if (requireNamespace("ggplot2", quietly = TRUE) &&
    requireNamespace("gapminder", quietly = TRUE) &&
    requireNamespace("dplyr", quietly = TRUE)) {
  library(ggplot2)
  library(gapminder)
  library(dplyr)

  dat <- gapminder %>%
    filter(year %in% c(1972, 1992, 2007))

  p3 <- ggplot(dat, aes(x = continent, y = lifeExp, fill = factor(year))) +
    geom_boxplot() +
    facet_wrap(~year) +
    scale_y_continuous(name = "Average Life Expectancy") +
    scale_x_discrete(labels = abbreviate, name = "Continent")

  print(p3)
}

Facetierter Boxplot mit einem Panel pro Jahr, das dieselben x- und y-Skalen teilt

Standardmäßig teilt jedes von facet_wrap erzeugte Panel dieselben Skalen, wodurch die Werte über die Panels hinweg direkt vergleichbar bleiben. Mit scales = "free" passt jedes Panel seine eigenen Achsen an die enthaltenen Daten an; das kann Details in einem engen Panel sichtbar machen, macht Panel-übergreifende Vergleiche aber auch irreführend, weil identische Höhen dann nicht mehr identische Werte bedeuten.

if (requireNamespace("ggplot2", quietly = TRUE) &&
    requireNamespace("gapminder", quietly = TRUE) &&
    requireNamespace("dplyr", quietly = TRUE)) {
  library(ggplot2)
  library(gapminder)
  library(dplyr)

  dat <- gapminder %>%
    filter(year %in% c(1972, 1992, 2007))

  p4 <- ggplot(dat, aes(x = continent, y = lifeExp, fill = factor(year))) +
    geom_boxplot() +
    facet_wrap(~year, scales = "free") +
    scale_y_continuous(name = "Average Life Expectancy") +
    scale_x_discrete(labels = abbreviate, name = "Continent")

  print(p4)
}

Facetierter Boxplot, bei dem jedes Jahres-Panel seine eigenen Achsenskalen anpasst

Auswählen eines Layouts und Prüfen des Ergebnisses

Verwenden Sie die fill-Gruppierung, wenn Sie nur wenige Gruppen haben und diese direkt innerhalb jeder x-Kategorie vergleichen möchten; verwenden Sie facet_wrap, wenn es viele Gruppen gibt oder jede Teilmenge ein eigenes Panel verdient. Sie können auch vertauschen, welche Variable für fill genutzt wird und welche facettiert. Das folgende Beispiel kehrt zum ungefilterten gapminder-Datensatz zurück, ordnet continent der Ästhetik fill zu und lässt facet_wrap jedes verfügbare Jahr übernehmen.

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

if (requireNamespace("ggplot2", quietly = TRUE) &&
    requireNamespace("gapminder", quietly = TRUE)) {
  library(ggplot2)
  library(gapminder)

  p5 <- ggplot(gapminder, aes(x = continent, y = lifeExp, fill = continent)) +
    facet_wrap(~year) +
    geom_boxplot() +
    scale_y_continuous(name = "Average Life Expectancy") +
    scale_x_discrete(labels = abbreviate, name = "Continent")

  print(p5)
}

Boxplots des vollständigen gapminder-Datensatzes, facettiert nach Jahr, wobei continent der fill-Farbe zugeordnet ist

Welches Layout Sie auch wählen: Prüfen Sie den gerenderten Plot auf die erwartete Anzahl von Boxen oder Panels pro Gruppe. Wenn eine numerische Spalte eine glatte Farblegende statt getrennter Boxen erzeugt, wandeln Sie sie zuerst mit factor um; wenn Panels in der Form identisch aussehen, sich aber in der Position unterscheiden, vergewissern Sie sich, dass die Skalen geteilt werden, bevor Sie Werte aus dem Diagramm ablesen.