Geoms (geometrische Objekte)

In ggplot2 wird eine Grafik erstellt, indem man Geoms deklariert; das ist die englische Kurzform für geometrische Objekte. Geoms werden nacheinander deklariert, eine Grafik kann also viele Geoms enthalten, die Daten visualisieren. Jedes Geom hat einen mehr oder weniger intuitiven Namen. Die Funktion geom_bar() erstellt Balkendiagramme, geom_line() erstellt Linien, geom_hline() erstellt horizontale Linien, geom_boxplot() erstellt Boxplots usw. Die folgende Liste zeigt die gebräuchlichsten geometrischen Objekte mit Links zur Dokumentation. Die Namen der Funktionen geben an, was sie visualisieren.

[geom_abline()](https://ggplot2.tidyverse.org/reference/geom_abline.html) [geom_hline()](https://ggplot2.tidyverse.org/reference/geom_abline.html) [geom_vline()](https://ggplot2.tidyverse.org/reference/geom_abline.html) [geom_bar()](https://ggplot2.tidyverse.org/reference/geom_bar.html) [geom_col()](https://ggplot2.tidyverse.org/reference/geom_bar.html) [stat_count()](https://ggplot2.tidyverse.org/reference/geom_bar.html) [geom_bin_2d()](https://ggplot2.tidyverse.org/reference/geom_bin_2d.html) [stat_bin_2d()](https://ggplot2.tidyverse.org/reference/geom_bin_2d.html) [geom_blank()](https://ggplot2.tidyverse.org/reference/geom_blank.html) [geom_boxplot()](https://ggplot2.tidyverse.org/reference/geom_boxplot.html) [stat_boxplot()](https://ggplot2.tidyverse.org/reference/geom_boxplot.html) [geom_contour()](https://ggplot2.tidyverse.org/reference/geom_contour.html) [geom_abline()](https://ggplot2.tidyverse.org/reference/geom_abline.html) [geom_hline()](https://ggplot2.tidyverse.org/reference/geom_abline.html) [geom_vline()](https://ggplot2.tidyverse.org/reference/geom_abline.html) [geom_bar()](https://ggplot2.tidyverse.org/reference/geom_bar.html) [geom_col()](https://ggplot2.tidyverse.org/reference/geom_bar.html) [stat_count()](https://ggplot2.tidyverse.org/reference/geom_bar.html) [geom_bin_2d()](https://ggplot2.tidyverse.org/reference/geom_bin_2d.html) [stat_bin_2d()](https://ggplot2.tidyverse.org/reference/geom_bin_2d.html) [geom_blank()](https://ggplot2.tidyverse.org/reference/geom_blank.html) [geom_boxplot()](https://ggplot2.tidyverse.org/reference/geom_boxplot.html) [stat_boxplot()](https://ggplot2.tidyverse.org/reference/geom_boxplot.html) [geom_contour()](https://ggplot2.tidyverse.org/reference/geom_contour.html) [geom_contour_filled()](https://ggplot2.tidyverse.org/reference/geom_contour.html) [stat_contour()](https://ggplot2.tidyverse.org/reference/geom_contour.html) stat_contour_filled() [geom_count()](https://ggplot2.tidyverse.org/reference/geom_count.html) [stat_sum()](https://ggplot2.tidyverse.org/reference/geom_count.html) [geom_density()](https://ggplot2.tidyverse.org/reference/geom_density.html) [stat_density()](https://ggplot2.tidyverse.org/reference/geom_density.html) [geom_density_2d()](https://ggplot2.tidyverse.org/reference/geom_density_2d.html) [geom_density_2d_filled()](https://ggplot2.tidyverse.org/reference/geom_density_2d.html) [stat_density_2d()](https://ggplot2.tidyverse.org/reference/geom_density_2d.html) [stat_density_2d_filled()](https://ggplot2.tidyverse.org/reference/geom_density_2d.html) [geom_dotplot()](https://ggplot2.tidyverse.org/reference/geom_dotplot.html) [geom_errorbarh()](https://ggplot2.tidyverse.org/reference/geom_errorbarh.html) [geom_function()](https://ggplot2.tidyverse.org/reference/geom_function.html) [stat_function()](https://ggplot2.tidyverse.org/reference/geom_function.html) [geom_hex()](https://ggplot2.tidyverse.org/reference/geom_hex.html) [stat_bin_hex()](https://ggplot2.tidyverse.org/reference/geom_hex.html) [geom_freqpoly()](https://ggplot2.tidyverse.org/reference/geom_histogram.html) [geom_histogram()](https://ggplot2.tidyverse.org/reference/geom_histogram.html) [stat_bin()](https://ggplot2.tidyverse.org/reference/geom_histogram.html) [geom_jitter()](https://ggplot2.tidyverse.org/reference/geom_jitter.html) [geom_crossbar()](https://ggplot2.tidyverse.org/reference/geom_linerange.html) [geom_errorbar()](https://ggplot2.tidyverse.org/reference/geom_linerange.html) [geom_linerange()](https://ggplot2.tidyverse.org/reference/geom_linerange.html) [geom_pointrange()](https://ggplot2.tidyverse.org/reference/geom_linerange.html) [geom_map()](https://ggplot2.tidyverse.org/reference/geom_map.html) [geom_path()](https://ggplot2.tidyverse.org/reference/geom_path.html) [geom_line()](https://ggplot2.tidyverse.org/reference/geom_path.html) geom_step() geom_point() [geom_polygon()](https://ggplot2.tidyverse.org/reference/geom_polygon.html) [geom_qq_line()](https://ggplot2.tidyverse.org/reference/geom_qq.html) [stat_qq_line()](https://ggplot2.tidyverse.org/reference/geom_qq.html) [geom_qq()](https://ggplot2.tidyverse.org/reference/geom_qq.html) [stat_qq()](https://ggplot2.tidyverse.org/reference/geom_qq.html) [geom_quantile()](https://ggplot2.tidyverse.org/reference/geom_quantile.html) [stat_quantile()](https://ggplot2.tidyverse.org/reference/geom_quantile.html) [geom_ribbon()](https://ggplot2.tidyverse.org/reference/geom_ribbon.html) [geom_area()](https://ggplot2.tidyverse.org/reference/geom_ribbon.html) [stat_align()](https://ggplot2.tidyverse.org/reference/geom_ribbon.html) [geom_rug()](https://ggplot2.tidyverse.org/reference/geom_rug.html) [geom_segment()](https://ggplot2.tidyverse.org/reference/geom_segment.html) [geom_curve()](https://ggplot2.tidyverse.org/reference/geom_segment.html) [geom_smooth()](https://ggplot2.tidyverse.org/reference/geom_smooth.html) [stat_smooth()](https://ggplot2.tidyverse.org/reference/geom_smooth.html) [geom_spoke()](https://ggplot2.tidyverse.org/reference/geom_spoke.html) [geom_label()](https://ggplot2.tidyverse.org/reference/geom_text.html) [geom_text()](https://ggplot2.tidyverse.org/reference/geom_text.html) [geom_raster()](https://ggplot2.tidyverse.org/reference/geom_tile.html) [geom_rect()](https://ggplot2.tidyverse.org/reference/geom_tile.html) [geom_tile()](https://ggplot2.tidyverse.org/reference/geom_tile.html) [geom_violin()](https://ggplot2.tidyverse.org/reference/geom_violin.html) [stat_ydensity()](https://ggplot2.tidyverse.org/reference/geom_violin.html)

Ästhetisches Mapping geometrischer Objekte

Ein geometrisches Objekt muss wissen, was visualisiert werden soll. Dies geschieht über das ästhetische Mapping, bei dem beispielsweise die Daten für die x-Achse, die y-Achse usw. angegeben werden. Das ästhetische Mapping wird mit der Funktion aes() definiert. Ein Geom kann das ästhetische Mapping vom Hauptaufruf in ggplot() erben, oder es wird im geometrischen Objekt selbst deklariert. Das Prinzip lautet: Ein Geom erbt immer aes() von ggplot(), sofern im Geom nichts anderes angegeben ist. Im Folgenden werden zwei identische Grafiken erstellt, indem aes() einmal in ggplot() und einmal in geom_point() angegeben wird; geom_point() erzeugt ein Streudiagramm (engl. scatter plot):

## aes() wird in ggplot() angegeben
ggplot(data=mpg, aes(x = displ, y = hwy)) +
  geom_point()

## aes() wird in geom_point() angegeben
ggplot(data=mpg) +
  geom_point(aes(x = displ, y = hwy))
Streudiagramm des Hubraums (displ) gegen den Kraftstoffverbrauch (hwy) im Datensatz mpg
Streudiagramm des Hubraums (displ) gegen den Kraftstoffverbrauch (hwy) im Datensatz mpg

Geometrische Objekte werden in Ebenen definiert

Sie können mehrere geometrische Objekte in einer Grafik darstellen, indem Sie sie nacheinander deklarieren. Nachdem ein geometrisches Objekt deklariert wurde, muss es mit + abgeschlossen und ein Zeilenumbruch gesetzt werden, um weitere Objekte oder Einstellungen zu deklarieren. Im Folgenden werden Daten aus mpg verwendet, um den Zusammenhang zwischen dem Hubraum des Motors (displ) und dem Kraftstoffverbrauch (hwy) mit zwei verschiedenen geometrischen Objekten darzustellen. Das erste Objekt ist geom_point(), das ein Streudiagramm der Datenpunkte erzeugt. Das zweite Objekt ist geom_smooth(), das automatisch eine flexible Regressionslinie für die Datenpunkte berechnet; diese erfasst lineare und nichtlineare Muster in den Daten.

ggplot(data = mpg, aes(x = displ, y = hwy)) +
  geom_point() +
  geom_smooth()
Streudiagramm von displ gegen hwy mit flexibler blauer Regressionslinie und grauem Konfidenzband aus geom_smooth

Beachten Sie, dass jedes geometrische Objekt das ästhetische Mapping (aes()) von ggplot() geerbt hat. Beachten Sie außerdem, dass die Punkte unter der Regressionslinie (blaue Linie) liegen; das liegt daran, dass geom_point() im obigen Code zuerst deklariert wurde.

Alle geometrischen Funktionen haben ein aes()-Argument, das heißt, das ästhetische Mapping kann stattdessen im geometrischen Objekt deklariert werden. Der folgende Code ergibt dieselbe Grafik wie oben, hier wird aes() jedoch in jedem Geom einzeln deklariert:

ggplot(data = mpg) +
  geom_point(aes(x = displ, y = hwy)) +
  geom_smooth(aes(x = displ, y = hwy))
Streudiagramm von displ gegen hwy mit flexibler blauer Regressionslinie und grauem Konfidenzband aus geom_smooth

Ein ästhetisches Mapping wirkt sich in verschiedenen Geoms unterschiedlich aus. Das wird im Folgenden veranschaulicht, indem die Variable class (Fahrzeugtyp) dem Argument color in aes() zugeordnet wird. Bei geom_point() führt dies dazu, dass die Datenpunkte nach Fahrzeugtyp farbcodiert werden. Bei geom_smooth() bedeutet es, dass separate Regressionslinien berechnet und (mit denselben Farben) farbcodiert werden:

ggplot(data = mpg, aes(x = displ, y = hwy, color=class)) +
  geom_point() +
  geom_smooth()
Streudiagramm von displ gegen hwy, farbcodiert nach Fahrzeugtyp (class), mit einer flexiblen Regressionslinie je Fahrzeugtyp

Wir können aes() in ggplot() (Zeile 1) ignorieren und in geom_smooth() (Zeile 3) ein separates aes() angeben. Im Folgenden geschieht dies, indem color dem Antriebsstrang des Fahrzeugs (drv) zugeordnet wird.

ggplot(data = mpg, aes(x = displ, y = hwy, color=class)) +
  geom_point() +
  geom_smooth(aes(color=drv))
Streudiagramm von displ gegen hwy, farbcodiert nach class, Regressionslinien je Antriebsstrang (drv) in derselben Legende

Leider sehen wir, dass rechts nur eine (statt zwei) Farblegende erscheint, wenn sowohl class als auch drv auf color gemappt werden. Dadurch werden die Farbcodes für drv (4, f, r) in derselben Spalte dargestellt wie die Farbcodes für class (2seater, compact, midsize, etc). Das kann bei der Interpretation der Grafik zu Mehrdeutigkeit führen. Um dies zu vermeiden, müssen wir drv einem anderen Argument in aes() zuordnen. In diesem Fall können wir drv auf linetype mappen, also auf die Linienart. Dann erhält jede Ausprägung von drv eine eigene Linienart. Beachten Sie außerdem, dass wir se=FALSE angeben, um das Konfidenzintervall der Linien zu entfernen, sowie method="lm", das eine lineare Regressionslinie statt einer flexiblen Linie darstellt (diese Ergänzungen dienen dazu, die Grafik übersichtlicher zu machen):

ggplot(data = mpg, aes(x = displ, y = hwy, color=class)) +
  geom_point() +
  geom_smooth(aes(linetype=drv), se=FALSE, method="lm")
Streudiagramm von displ gegen hwy, farbcodiert nach class, mit linearen Regressionslinien, deren Linienart den Antriebsstrang (drv) angibt

Es hat funktioniert! Können Sie erkennen, ob der Zusammenhang zwischen displ und hwy mit verschiedenen Kombinationen von suv und drv variiert?

Ein geometrisches Objekt kann eine Untergruppe des Datensatzes verwenden. Wir erstellen die obige Grafik erneut und zeigen die Regressionslinie nur für Fahrzeuge der Klasse pickup:

ggplot(data = mpg, aes(x = displ,
                       y = hwy,
                       color=class)) +
  geom_point() +
  geom_smooth(data=filter(mpg, class=="pickup"))
Streudiagramm von displ gegen hwy, farbcodiert nach class, mit flexibler Regressionslinie nur für Pickups

Auf dieselbe Weise können wir ein geometrisches Objekt erstellen, um einen Teil der Daten hervorzuheben. Wir gehen nun wie folgt vor:

  1. Zeile 8: Ein geom_point() nur mit Pickups hinzufügen, mit schwarzen Punkten der Größe 4,5.

  2. Zeile 9: Ein geom_point() nur mit Pickups hinzufügen, in der Größe 2,5. Diese erben color=class von ggplot().

  3. Zeile 12: Ein geom_smooth() nur mit Pickups.

ggplot(data = mpg, aes(x = displ,
                       y = hwy,
                       color=class)) +
  # Alle Datenpunkte
  geom_point() +

  # Datenpunkte für Pickups
  geom_point(data=filter(mpg, class=="pickup"), size=4.5, color="black") +
  geom_point(data=filter(mpg, class=="pickup"), size=2.5) +

  # Linie für Pickups
  geom_smooth(data=filter(mpg, class=="pickup"))
Streudiagramm von displ gegen hwy, in dem Pickups durch größere, schwarz umrandete Punkte und eine eigene Regressionslinie hervorgehoben sind

Ziel ist es, die Grafik auf Pickups zu fokussieren. Die Punkte der Größe 2,5 werden nach den Punkten der Größe 4,5 deklariert, sodass die kleineren Punkte über den großen liegen. Das Objekt geom_smooth() wird ganz zuletzt deklariert und liegt deshalb in der Grafik ganz vorne.