8  Aufbau einer Grafik

In diesem Kapitel werden wir anhand mehrerer interessanter Datensätze den Aufbau einer ggplot2-Grafik vertiefen. Für den ersten Teil nutzen wir die Datentabelle mpg, die im Paket ggplot2 enthalten ist.

mpg
# A tibble: 234 × 11
   manufacturer model      displ  year   cyl trans drv     cty   hwy fl    class
   <chr>        <chr>      <dbl> <int> <int> <chr> <chr> <int> <int> <chr> <chr>
 1 audi         a4           1.8  1999     4 auto… f        18    29 p     comp…
 2 audi         a4           1.8  1999     4 manu… f        21    29 p     comp…
 3 audi         a4           2    2008     4 manu… f        20    31 p     comp…
 4 audi         a4           2    2008     4 auto… f        21    30 p     comp…
 5 audi         a4           2.8  1999     6 auto… f        16    26 p     comp…
 6 audi         a4           2.8  1999     6 manu… f        18    26 p     comp…
 7 audi         a4           3.1  2008     6 auto… f        18    27 p     comp…
 8 audi         a4 quattro   1.8  1999     4 manu… 4        18    26 p     comp…
 9 audi         a4 quattro   1.8  1999     4 auto… 4        16    25 p     comp…
10 audi         a4 quattro   2    2008     4 manu… 4        20    28 p     comp…
# ℹ 224 more rows
glimpse(mpg)
Rows: 234
Columns: 11
$ manufacturer <chr> "audi", "audi", "audi", "audi", "audi", "audi", "audi", "…
$ model        <chr> "a4", "a4", "a4", "a4", "a4", "a4", "a4", "a4 quattro", "…
$ displ        <dbl> 1.8, 1.8, 2.0, 2.0, 2.8, 2.8, 3.1, 1.8, 1.8, 2.0, 2.0, 2.…
$ year         <int> 1999, 1999, 2008, 2008, 1999, 1999, 2008, 1999, 1999, 200…
$ cyl          <int> 4, 4, 4, 4, 6, 6, 6, 4, 4, 4, 4, 6, 6, 6, 6, 6, 6, 8, 8, …
$ trans        <chr> "auto(l5)", "manual(m5)", "manual(m6)", "auto(av)", "auto…
$ drv          <chr> "f", "f", "f", "f", "f", "f", "f", "4", "4", "4", "4", "4…
$ cty          <int> 18, 21, 20, 21, 16, 18, 18, 18, 16, 20, 19, 15, 17, 17, 1…
$ hwy          <int> 29, 29, 31, 30, 26, 26, 27, 26, 25, 28, 27, 25, 25, 25, 2…
$ fl           <chr> "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p", "p…
$ class        <chr> "compact", "compact", "compact", "compact", "compact", "c…

Der Datensatz enthält 11 Merkmale (in den Spalten) von 234 Beobachtungen (Autos, in den Zeilen).

Tabelle 8.1: Zusammenfassung Merkmale der Datentabelle mpg.
Merkmal Bedeutung Skalentyp in R
manufacturer Hersteller nominal <chr>
model Modell nominal <chr>
displ Hubraum in Litern metrisch <dbl>
year Baujahr metrisch <int>
cyl Anzahl der Zylinder metrisch <int>
trans Getriebeart nominal <chr>
drv Antrieb nominal <chr>
cty Meilen pro Gallone in der Stadt metrisch <int>
hwy Meilen pro Gallone auf dem Highway metrisch <int>
fl Kraftstoffart nominal <chr>
class Fahrzeugklasse nominal <chr>

8.1 Schema einer Grafik

Wir wollen anhand der obigen Datentabelle die folgende Frage beantworten:

Frage: „Fahren Autos mit großem Motor mit einer Gallone weniger weit?“

Sowohl das Merkmal displ als auch hwy sind metrische Merkmale. Wir haben in Kapitel 7 bereits ein Streudiagramm erstellt, was die naheliegende Wahl für die gleichzeitige Darstellung zweier metrischer Merkmale ist (siehe hierzu auch Kapitel 5.5.3).

mpg |> ggplot() +
       geom_point(aes(x = displ, y = hwy))
Abbildung 8.1: Ein einfaches Streudiagramm.

Ausgehend von einer einfachen Grafik, die nur aus der Funktion ggplot() sowie einer geometrischen Funktion (im obigen Beispiel: geom_point()) besteht, wollen wir eine allgemeine Vorlage für eine Grafik angeben. Wie bereits erwähnt, sind ggplot2-Grafiken in Schichten aufgebaut. Eine Vorlage könnte zum Beispiel so aussehen:

DATEN |> ggplot() + 
         geom_FUNKTION(
            mapping = aes(MAPPING),
            stat = STAT, 
            position = POSITION,
            ...) +
         facet_FUNKTION() + 
         scale_FUNKTION() +
         coord_FUNKTION() +
         theme_FUNKTION() +
         labs()

wobei die groß geschriebenen Ausdrücke Platzhalter sind. Das einfachste Beispiel einer sinnvollen Grafik enthält zumindest die Funktion ggplot() sowie eine geometrische Funktion:

mpg |> ggplot() +
       geom_point(aes(x = hwy, y = cyl))
Abbildung 8.2: Ein einfaches Streudiagramm. An dieser Stelle ist diese Grafik nicht gut geeignet, weil zu viele Beobachtungen übereinanderliegen.

Diese Grafik ist offenbar keine gute Grafik, da sehr viele Beobachtungen übereinanderliegen. Es gibt nun diverse Möglichkeiten, dies zu verbessern. Eine Möglichkeit könnte sein, die geometrische Funktion derart zu ändern, dass die Daten besser sichtbar werden.

mpg |> ggplot() +
       geom_jitter(aes(x = hwy, y = cyl))
Abbildung 8.3: Die gleichen Daten, aber eine andere geometrische Funktion. Die geometrische Funktion geom_jitter() wackelt ein wenig an den Koordinaten der Punkte, so dass Datenpunkte, die übereinander liegen, sichtbar werden.

Auch diese Grafik ist natürlich nicht ideal, allerdings sieht man nun schon, dass es sich um sehr viel mehr Beobachtungen handelt als Abbildung 8.2 vermuten ließ.

HinweisAufgabe: Optimierung

Die Funktion geom_jitter() hat die Argumente width= und height=. Welche Auswirkungen hat das Ändern dieser Werte auf die Abbildung 8.3?

width= und height= geben an, wie hoch die Streuungen in x- bzw. y-Richtung maximal sein dürfen.

Wir wollen nun ein wenig systematischer an das Erstellen einer Grafik herangehen und die Bedeutung der Aesthetics einer Grafik klarmachen.

8.2 Aesthetics

mpg |> ggplot() + 
       geom_point(aes(x = displ, y = hwy, color = class))
Abbildung 8.4: Um das kategoriale Merkmal class sichtbar zu machen, wird dieses dem Argument color= zugewiesen. Die Punkte werden bezüglich der verschiedenen Ausprägungen des Merkmals class gefärbt.
mpg |> ggplot() + 
       geom_point(aes(x = displ, y = hwy, alpha = class))
Warning: Using alpha for a discrete variable is not advised.
Abbildung 8.5: Das Argument alpha= ist der Füllgrad der Punkte. Die Färbung hier findet wieder bezüglich eines kategorialen Merkmals statt, was aber schlecht ist, da alpha= Werte zwischen 0 und 1 annimmt und nicht für die Nutzung kategorialer Merkmale geeignet ist.
mpg |> ggplot() + 
       geom_jitter(aes(x = displ, y = hwy, alpha = cty))
Abbildung 8.6: Für metrische Merkmale oder um Überlappungen zu zeigen ist das Argument alpha= geeignet.

Die Funktion aes() steht für aesthetic. In ihren Argumenten werden den visuellen Eigenschaften der Grafik Merkmale der Beobachtungen zugeordnet; so ordnet man z.B. der Farbe (color=) oder der Sättigung (alpha=) die Klasse zu.

Bei welchen geometrischen Funktionen welche aes()-Argumente existieren, bzw. welche zwingend benötigt werden, hängt von der Grafik ab, die erzeugt werden soll. Die geometrische Funktion geom_point() zum Beispiel benötigt zwingend die Argumente x= und y= in der Funktion aes().

8.2.1 Warnungen

mpg |> ggplot() +
       geom_point(aes(x = displ, y = hwy, 
                      alpha = class))
Warning: Using alpha for a discrete variable is not advised.
Abbildung 8.7: Warnungen 1: das Argument alpha= ist nicht für kategoriale Daten geeignet!
mpg |> ggplot() + 
       geom_point(mapping = aes(x = displ, y = hwy, shape = class))
Warning: The shape palette can deal with a maximum of 6 discrete values because more
than 6 becomes difficult to discriminate
ℹ you have requested 7 values. Consider specifying shapes manually if you need
  that many of them.
Warning: Removed 62 rows containing missing values or values outside the scale range
(`geom_point()`).
Abbildung 8.8: Warnungen 2: das Argument shape= ist nur geeignet, wenn das Merkmal nicht zu viele Ausprägungen hat. Im Beispiel können nur 6 der 7 Ausprägungen dargestellt werden.

Manche Aesthetics sind zwingend notwendig, andere Aesthetics (hier: shape= und alpha=) liefern ggf. Warnungen, allerdings werden die Grafiken trotzdem dargestellt, wenn auch nicht immer komplett, wie im Beispiel mit shape= zu sehen ist!

  • Es ist möglich, auch außerhalb der Funktion aes() Argumente, die das gesamte Aussehen der Grafik beeinflussen, anzuführen.
mpg |> ggplot() + 
       geom_point(aes(x = displ, y = hwy), 
                  col = "blue",
                  alpha = 0.2,
                  position = "jitter")
Abbildung 8.9: Das Argument color= kann bei den meisten geometrischen Funktionen auch außerhalb der Funktion aes() stehen, allerdings nur, wenn eine Farbe zugewiesen ist und kein Merkmal.

In Abbildung 8.9 werden alle Punkte blau gezeichnet (col = "blue") und haben eine Färbung/Sättigung von 20\% (alpha = 0.2).

  • Diese von den Daten unabhängige Veränderung erzeugt keine Legende.
  • Die dunklere Färbung mancher Punkte kommt aufgrund der Überlagerung mehrerer Punkte zustande.
  • In Abbildung 8.9 wurde zusätzlich die Option position = "jitter" gesetzt, um die Punkte leicht zufällig gegeneinander zu verschieben.
HinweisAufgabe
  1. Wieso sind in der folgenden Grafik die Punkte rot und nicht blau?
mpg |> ggplot() + 
       geom_point(mapping = aes(x = displ, y = hwy, color = "blue"))

  1. Wie lautet der korrekte Code um die Punkte blau einzufärben?

  2. Bilden Sie eine numerische Variable auf die Argumente color=, size= und shape= ab. Was fällt auf und was ist der Unterschied zu einer kategorialen Variablen wie z.B. class?

  3. Was passiert, wenn mehrere Variablen auf die gleichen Argumente abgebildet werden?

  4. Was macht das stroke=-Argument? Verwenden Sie ggf. die Hilfe für geom_point().

  1. Wenn die Farbe nicht von einem Merkmal abhängt, dann muss diese außerhalb der Funktion aes() stehen.

  2. Richtig ist also

mpg |> ggplot() + 
       geom_point(mapping = aes(x = displ, y = hwy), color = "blue")

mpg |> ggplot() + 
       geom_point(mapping = aes(x = displ, y = hwy, color = cty))

Bei der Farbe wird ein Gradient gezeichnet, da jeder Wert aus dem Intervall angenommen werden könnte.

mpg |> ggplot() + 
       geom_point(mapping = aes(x = displ, y = hwy, size = cty))

Bei size= wird die Fläche der dargestellten Punkte bezüglich des metrischen Merkmals skaliert.

Bei shape= erhalten wir eine Fehlermeldung, da diese nur für kategoriale Merkmale (mit höchstens ein paar Ausprägungen) genutzt werden kann.

  1. Es wird nur das erste Merkmal verwendet.

mpg |> ggplot() + 
       geom_point(mapping = aes(x = displ, y = hwy), stroke = 2, alpha = 0.2)

stroke= gibt die Dicke des Randes an. Hier muss ein numerischer Wert angegeben werden!

8.3 Facetten

Die Funktionen facet_wrap() und facet_grid() bilden (neben den Aesthetics) eine Möglichkeit, ein zusätzliches kategoriales Merkmal sichtbar zu machen.

mpg |> ggplot() + 
       geom_point(aes(x = displ, y = hwy)) + 
       facet_wrap(~ class, nrow = 2)
Abbildung 8.10: Facetten bieten eine weitere Möglichkeit, ein kategoriales Merkmal sichtbar zu machen.

Die Funktion facet_wrap() benötigt ein Argument (nach einer Tilde) und spaltet die Grafik nach dieser Variablen auf. Es entstehen so viele Untergrafiken, wie das Merkmal Ausprägungen hat. Das Argument nrow= gibt an, auf wie viele Zeilen diese Grafiken aufgeteilt werden sollen. Alternativ kann auch das Argument ncol= verwendet werden, wobei damit die Anzahl der Spalten angegeben werden kann.

mpg |> ggplot() + 
       geom_point(aes(x = displ, y = hwy)) + 
       facet_grid(drv ~ class)
Abbildung 8.11: Die Funktion facet_grid() bietet eine Möglichkeit, sogar zwei kategoriale Merkmale sichtbar zu machen.

Die Funktion facet_grid() benötigt zwei Argumente. Die Ausprägungen des ersten Arguments (im Beispiel drv) stehen in den Zeilen, die Ausprägungen des zweiten Arguments in den Spalten.

Es ist auch möglich, die Funktion facet_grid() wie facet_wrap() zu nutzen, wenn vor der Tilde ein Punkt . steht. Man nennt eine Zuordnung y ~ x in R eine Formel. Ein Beispiel:

mpg |> ggplot() + 
       geom_point(mapping = aes(x = displ, y = hwy)) + 
       facet_grid(. ~ cyl)

8.4 Geometrische Objekte

Wir haben schon in Kapitel 7 gesehen, dass man mehrere geometrische Funktionen in einer Grafik zusammenbringen kann, wie zum Beispiel in der folgenden Grafik.

mpg |> ggplot() + 
       geom_point(aes(x = displ, y = hwy)) +
       geom_smooth(aes(x = displ, y = hwy))
Abbildung 8.12: Zwei geometrische Funktionen in einer Grafik

Die Reihenfolge ist wichtig, da die verschiedenen Schichten nacheinander gezeichnet werden. So kann man in Abbildung 8.12 sehen, dass die blaue Kurve nach den Punkten gezeichnet wurde.

  • Welche geometrischen Objekte verwendet werden können bzw. sollen, hängt von den Daten ab. Dabei spielt sowohl die Anzahl der darzustellenden Merkmale als auch die Art der Merkmale (kategorial oder metrisch) eine Rolle.

  • Um Redundanzen im Code zu vermeiden, können globale Aesthetics in die ggplot-Funktion geschrieben werden.

Abbildung 8.12 kann auch geschrieben werden als

mpg |> ggplot(aes(x = displ, y = hwy)) +
       geom_point() +
       geom_smooth()  

Aesthetics, die nur eine geometrische Funktion betreffen, werden hingegen lokal in die betreffende geometrische Funktion geschrieben.

mpg |> ggplot(aes(x = displ, y = hwy)) +
       geom_point(aes(color = class)) + 
       geom_smooth(color = "black")  
Abbildung 8.13: Die Daten für die Punkte und die Kurve sind die gleichen, daher können diese in die Funktion ggplot() geschrieben werden. Die Farbe der Punkte bzw. der Kurve betrifft allerdings nur die jeweilige geometrische Funktion. Es ist zu bemerken, dass die Farbe der Punkte vom Merkmal class abhängt, weswegen color = class innerhalb der Funktion aes() stehen muss. Bei color = "black" ist dies nicht der Fall.

Bemerkungen zu Abbildung 8.13:

  • In der Funktion ggplot() stehen die Merkmale displ und hwy. Diese betreffen alle folgenden geometrischen Funktionen. Da es sich um Merkmale handelt, muss die Zuweisung innerhalb der Funktion aes() erfolgen.

  • Das Merkmal class in der geometrischen Funktion geom_point() legt nur die Farbgebung der Punkte fest. Da es sich bei class auch um ein Merkmal handelt, muss die Zuweisung color = class innerhalb der Funktion aes() erfolgen und es werden keine Anführungszeichen gesetzt.

  • In der zweiten geometrischen Funktion wird festgelegt, dass die Linie der Kurve schwarz sein soll color = "black". Dies betrifft ausschließlich die Kurve, und da es sich nicht um ein Merkmal handelt, steht dies direkt als Argument in der Funktion geom_smooth().

Weitere Beispiele

mpg |> ggplot() + 
       geom_smooth(aes(x = displ, y = hwy, linetype = drv))
Abbildung 8.14: Zwei metrische und ein kategoriales Merkmal. Die Kurven werden nur auf dem Bereich dargestellt, in dem Daten vorhanden sind.
mpg |> ggplot(mapping = aes(x = displ, y = hwy, color = drv)) + 
       geom_point() + 
       geom_smooth(se = FALSE)
Abbildung 8.15: Die drei Merkmale sind global definiert, so dass sie für beide geometrischen Funktionen gültig sind.

Bemerkungen:

  • Das Argument se = FALSE im obigen Beispiel schaltet die Konfidenzintervalle (grauer Bereich um die Kurve) aus.
  • Welche Argumente die jeweiligen geometrischen Funktionen haben, kann man mit der Hilfe-Funktion erfahren, z.B.
?geom_smooth    # oder  help(geom_smooth)

8.4.1 Geometrische Objekte für gefilterte Daten

Es ist möglich, für verschiedene Schichten auch verschiedene Daten zu nutzen.

  • Die Funktion filter() filtert Datenzeilen nach einem vorgegebenen Kriterium.
  • In den Beispielen werden die globalen Daten durch die lokalen überschrieben – allerdings nur für die jeweilige Schicht!
mpg |> ggplot(aes(x = displ, y = hwy)) + 
       geom_point(mapping = aes(color = class)) + 
       geom_smooth(data = filter(mpg, class == "subcompact"), 
                   se = FALSE) + 
       theme(legend.position = "bottom")   # Legende unten
Abbildung 8.16: Die Punkte werden für alle Daten gezeichnet, die geglättete Kurve nur für die Fahrzeugklasse subcompact.
mpg |> ggplot(aes(x = displ, y = hwy)) + 
       geom_point() + 
       geom_point(data = filter(mpg, class == "2seater"), 
                  col = "red") + 
       geom_smooth(data = filter(mpg, class != "2seater"))
Abbildung 8.17: In zwei der Funktionen werden gefilterte Daten verwendet. Diese müssen der geometrischen Funktion über das Argument data= übergeben werden.

Die Reihenfolge ist wichtig, da im letzten Beispiel ein Teil der Punkte aus der Funktion geom_point() durch die zweite geom_point()-Funktion „verdeckt“ wird.

8.5 Statistische Transformationen

In diesem Kapitel werden wir die Datentabelle diamonds aus dem Paket ggplot2 verwenden.

diamonds
# A tibble: 53,940 × 10
   carat cut       color clarity depth table price     x     y     z
   <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
 1  0.23 Ideal     E     SI2      61.5    55   326  3.95  3.98  2.43
 2  0.21 Premium   E     SI1      59.8    61   326  3.89  3.84  2.31
 3  0.23 Good      E     VS1      56.9    65   327  4.05  4.07  2.31
 4  0.29 Premium   I     VS2      62.4    58   334  4.2   4.23  2.63
 5  0.31 Good      J     SI2      63.3    58   335  4.34  4.35  2.75
 6  0.24 Very Good J     VVS2     62.8    57   336  3.94  3.96  2.48
 7  0.24 Very Good I     VVS1     62.3    57   336  3.95  3.98  2.47
 8  0.26 Very Good H     SI1      61.9    55   337  4.07  4.11  2.53
 9  0.22 Fair      E     VS2      65.1    61   337  3.87  3.78  2.49
10  0.23 Very Good H     VS1      59.4    61   338  4     4.05  2.39
# ℹ 53,930 more rows
glimpse(diamonds)
Rows: 53,940
Columns: 10
$ carat   <dbl> 0.23, 0.21, 0.23, 0.29, 0.31, 0.24, 0.24, 0.26, 0.22, 0.23, 0.…
$ cut     <ord> Ideal, Premium, Good, Premium, Good, Very Good, Very Good, Ver…
$ color   <ord> E, E, E, I, J, J, I, H, E, H, J, J, F, J, E, E, I, J, J, J, I,…
$ clarity <ord> SI2, SI1, VS1, VS2, SI2, VVS2, VVS1, SI1, VS2, VS1, SI1, VS1, …
$ depth   <dbl> 61.5, 59.8, 56.9, 62.4, 63.3, 62.8, 62.3, 61.9, 65.1, 59.4, 64…
$ table   <dbl> 55, 61, 65, 58, 58, 57, 57, 55, 61, 61, 55, 56, 61, 54, 62, 58…
$ price   <int> 326, 326, 327, 334, 335, 336, 336, 337, 337, 338, 339, 340, 34…
$ x       <dbl> 3.95, 3.89, 4.05, 4.20, 4.34, 3.94, 3.95, 4.07, 3.87, 4.00, 4.…
$ y       <dbl> 3.98, 3.84, 4.07, 4.23, 4.35, 3.96, 3.98, 4.11, 3.78, 4.05, 4.…
$ z       <dbl> 2.43, 2.31, 2.31, 2.63, 2.75, 2.48, 2.47, 2.53, 2.49, 2.39, 2.…

Die Datentabelle diamonds enthält 10 Merkmale in den Spalten und 53.940 Beobachtungen in den Zeilen. Die Merkmale cut, color und clarity sind kategorial, genauer ordinal (<ord>), das heißt sie können angeordnet werden. Alle anderen Merkmale sind metrisch (<dbl> bzw. <int>).

Tabelle 8.2: Zusammenfassung Merkmale der Datentabelle diamonds.
Merkmal Bedeutung Skalentyp in R
carat Gewicht der Diamanten metrisch <dbl>
cut Qualität des Schnitts ordinal <ord>
color Diamantenfarbe D (beste) bis J (schlechteste) ordinal <ord>
clarity Klarheit der Diamanten ordinal <ord>
depth Absolute Tiefe in Prozent metrisch <dbl>
table Breite Oberseite relativ zu breitestem Punkt metrisch <dbl>
price Preis in US-Dollar metrisch <int>
x Länge in mm metrisch <dbl>
y Breite in mm metrisch <dbl>
z Tiefe in mm metrisch <dbl>
HinweisAufgabe: Eigenschaften diamonds
  1. Das Merkmal clarity, die Klarheit der Diamanten, ist ordinal. Welche Ausprägungen gibt es und wie lautet die Ordnung?

  2. Die Funktion summary() hilft, einen Überblick über eine Datentabelle zu bekommen.

  • Was zeigt die Funktion an?
  • Gibt es Werte in der Datentabelle diamonds, die Ihnen seltsam vorkommen?
  1. Wir sehen die ersten Einträge sowie die Levels und deren Ordnung.
levels(diamonds$clarity)
[1] "I1"   "SI2"  "SI1"  "VS2"  "VS1"  "VVS2" "VVS1" "IF"  

Die Level stehen in der aufsteigenden Reihenfolge in der Auflistung.

  1. Die Funktion summary() gibt jeweils einen Überblick über die Daten.
  • Bei metrischen Merkmalen werden die Quartile, Minimum, Maximum und das arithmetische Mittel angezeigt.
  • Bei ungeordneten Faktoren und logischen Merkmalen wird die Anzahl der häufigsten Ausprägungen in absteigender Reihenfolge angezeigt.
  • Bei geordneten Faktoren wird die Anzahl der jeweiligen Ausprägungen angezeigt, die Ordnung bleibt erhalten.
  • Bei Zeichenketten wird nur angezeigt, dass es sich um ein solches Merkmal handelt.

Ferner werden NAs angezeigt.

8.5.1 Säulendiagramme

diamonds |> ggplot() + 
            geom_bar(mapping = aes(x = cut))
Abbildung 8.18: Ein einfaches Säulendiagramm des Merkmals cut.

Auf der x-Achse der Grafik ist die Variable cut abgetragen. Auf der y-Achse ist die Anzahl count des jeweiligen Schliffs abgetragen, allerdings ist count keine Variable des Datensatzes diamonds, sondern eine berechnete Größe: sie entspricht der Anzahl, wie oft die jeweilige Ausprägung in der Variablen cut vorkommt. Wir bezeichnen das Berechnen von solchen Größen, die zum Erstellen von Grafiken notwendig sind, als statistische Transformationen.

Man kann erkennen, dass bessere Diamanten häufiger verkauft wurden.

diamonds |> count(cut)
# A tibble: 5 × 2
  cut           n
  <ord>     <int>
1 Fair       1610
2 Good       4906
3 Very Good 12082
4 Premium   13791
5 Ideal     21551

Beispiele zu statistischen Transformationen:

Einige Grafiken, wie zum Beispiel das Streudiagramm (scatter plot, erzeugt mit geom_point()), stellen die Rohdaten dar. Andere Funktionen berechnen neue Werte, um die Daten darzustellen.

  • Säulendiagramme (geom_bar(), geom_dotplot()), Histogramme (geom_histogram()) und Häufigkeitspolygone (geom_freqpoly()) stellen Anzahlen grafisch dar, die aus den Daten berechnet wurden.

  • Geglätteten Kurven (geom_smooth()) liegt ein Modell zugrunde. Die gezeichnete Linie / Bereiche sind Vorhersagen durch ebendieses Modell.

  • Boxplots (geom_boxplot()) berechnen robuste Lage- und Streumaße einer Verteilung und stellen diese dar.

diamonds |> ggplot() + 
            geom_bar(aes(x = cut))
Abbildung 8.19: Säulendiagramm
diamonds |> ggplot() + 
            geom_smooth(aes(x = carat, y = price))
`geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'
Abbildung 8.20: Geglättete Kurve
diamonds |> ggplot() + 
            geom_boxplot(aes(x = color, y = price))
Abbildung 8.21: Boxplot
Abbildung 8.22: Die Grafik zeigt, wie aus einer Datentabelle die zugehörigen Anzahlen berechnet werden, um daraus das Säulendiagramm zu erstellen. (Quelle: r4ds)
  • Die Funktion geom_bar() startet mit der Datentabelle diamonds.
  • Danach transformiert geom_bar() die Datentabelle derart, dass eine Datentabelle mit den Ausprägungen von cut sowie den zugehörigen Anzahlen count entsteht.
  • Zuletzt werden die transformierten Daten herangezogen, um die Grafik zu erstellen, wobei die Ausprägungen von cut auf der x-Achse und count auf der y-Achse abgebildet werden.

Säulendiagramm ohne Berechnung der Anzahlen

  • Statt die Anzahl der Einträge einer Ausprägung zu zählen, gibt es die Möglichkeit, die Ausprägung selbst als Wert zu nehmen.
  • Im folgenden Beispiel wird eine solche Tabelle erzeugt.
daten <- tribble(~schnitt,      ~haeufigkeit,  
                  "Fair",        1610,
                  "Good",        4906,
                  "Very Good",  12082,
                  "Premium",    13791,
                  "Ideal",      21551
                 )
daten |> ggplot() +
         geom_bar(aes(x = schnitt, y = haeufigkeit), 
                  stat = "identity")
Abbildung 8.23: Die Ausprägung des Merkmals haeufigkeit wird als Wert verwendet. Es findet keine statistische Transformation im Sinne der Abbildung 8.22 statt. Die Anordnung auf der x-Achse ist alphabetisch, da das Merkmal schnitt kein Faktor ist.

Wollen wir nun aus dieser Datentabelle ein Säulen- oder Balkendiagramm erstellen, so erfordert dies keine statistische Transformation in dem Sinn, dass die Anzahlen gezählt werden müssen, bevor sie dargestellt werden. Stattdessen soll der im Merkmal haeufigkeit angeführte Wert verwendet werden.

  • Dies geschieht mit dem Argument stat = "identity".

8.5.2 Anteile und andere statistische Kenngrößen

Oft ist es auch interessant, relative statt absolute Größen darzustellen.

diamonds |> ggplot() +
            geom_bar(aes(x = cut, 
                     y = after_stat(prop),
                     group = 1))
Abbildung 8.24: Mit y = after_stat(prop) und group = 1 werden statt der absoluten Häufigkeiten die relativen Häufigkeiten (Anteile) dargestellt.

Barplot fill= und colour=

  • Man kann Säulendiagramme mit Hilfe der Argumente fill= bzw. colour= (oder auch color=) einfärben.
  • Das Argument colour= bzw. color= bezieht sich dabei auf den Rand der Säulen.
  • Das Argument fill= bezieht sich auf die Füllfarbe der Säulen.
  • Möchte man keine flächige Färbung haben, so kann dies mit fill=NA (not available) geschehen. Ansonsten wird die Farbe des aktuellen Farbschemas verwendet.
  • Mit den Argumenten innerhalb von aes() wird der Füllung bzw. Umrandung ein Merkmal zugeordnet (hier cut) und eine Legende hinzugefügt.
diamonds |> ggplot() + 
            geom_bar(aes(x = cut, 
                         colour = cut),
                     fill = NA)
Abbildung 8.25: Bei der Funktion geom_bar() bezieht sich das Argument colour= auf den Rand der Balken. Die Füllung geschieht mit fill=.
diamonds |> ggplot() + 
            geom_bar(aes(x = cut, fill = cut))
Abbildung 8.26: Jedes dieser Argumente kann auch bezüglich eines Merkmals gefärbt werden, auch wenn dies aufgrund der Redundanz im Allgemeinen nicht zu empfehlen ist.
Abbildung 8.27: Die Grafik zeigt, wie aus einer Datentabelle die zugehörigen Farben generiert und zugewiesen werden. (Quelle: r4ds)
  • Gestartet wird mit dem Datensatz diamonds.
  • Danach berechnet stat_count() die Anzahl der Beobachtungen für jede Ausprägung von cut.
  • Die Häufigkeit jeder Ausprägung wird mit einer Säule dargestellt.
  • Für jede Ausprägung von cut erhält fill= einen anderen Wert, also eine andere Farbe.
  • Schließlich wird ein kartesisches Koordinatensystem generiert und
  • die y-Variable auf die berechnete Anzahl sowie die x-Variable auf die Ausprägungen von cut abgebildet.

8.5.3 Platzierung der Balken / Säulen

  • Nutzt man das Argument fill= für ein weiteres Merkmal, so erhält man ein gestapeltes Säulendiagramm.

  • Möchte man dies nicht haben, so kann man das Argument position= nutzen. Es kann die Werte identity, dodge und fill annehmen. Dabei bedeutet der Wert fill, dass alle Säulen gleich hoch gezeichnet werden, um Verhältnisse gut erkennen zu können.

diamonds |> ggplot() +  
            geom_bar(aes(x = cut, fill = clarity))
Abbildung 8.28: Gestapeltes Säulendiagramm: Geschieht das Füllen der Säulen (oder Balken) in der Funktion geom_bar() in Abhängigkeit von einem Merkmal, so sind die entstehenden Teilsäulen gestapelt.
diamonds |> ggplot() + 
            geom_bar(aes(x = cut, fill = clarity), 
            position = "dodge")
Abbildung 8.29: Durch das Argument position = "dodge" können die Teilsäulen auch nebeneinander dargestellt werden. So ist es möglich, zwei kategoriale Merkmale gleichzeitig darzustellen und man erhält gruppierte Säulendiagramme.