Читать книгу R für Data Science - Hadley Wickham - Страница 38
Geometrische Objekte
ОглавлениеInwieweit ähneln sich diese beiden Diagramme?
Beide Diagramme enthalten dieselbe Variable x und dieselbe Variable y, und beide beschreiben dieselben Daten. Aber die Diagramme sind nicht identisch. Die einzelnen Diagramme verwenden verschiedene visuelle Objekte, um die Daten darzustellen. In der ggplot2-Syntax sagen wir, dass sie verschiedene geoms verwenden.
Ein geom ist das geometrische Objekt, das ein Diagramm verwendet, um Daten darzustellen. Oftmals werden Diagramme nach dem Typ des geom beschrieben, den das Diagramm verwendet. Zum Beispiel verwenden Balkendiagramme geom_bar, Liniendiagramme geom_line, Boxplots verwenden geom_boxplot usw. Streudiagramme durchbrechen diesen Trend, sie verwenden geom_point. Wie man in den obigen Diagrammen sehen kann, lassen sich dieselben Daten mit verschiedenen geom-Objekten darstellen. Das linke Diagramm verwendet das geom_point, das rechte Diagramm das geom_smooth, eine glatte Linie, die an die Daten angeglichen ist.
Um das geom in einem Diagramm zu ändern, wechseln Sie die geom-Funktion aus, die Sie ggplot() hinzugefügt haben. Zum Beispiel können Sie für die obigen Diagramme den folgenden Code verwenden:
# left
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy))
# right
ggplot(data = mpg) +
geom_smooth(mapping = aes(x = displ, y = hwy))
Jede geom-Funktion in ggplot2 übernimmt ein Argument mapping. Allerdings funktioniert nicht jede visuelle Eigenschaft mit jedem geometrischen Objekt. Man kann zwar die Form eines Punkts festlegen, jedoch nicht die »Form« einer Linie. Andererseits könnte man den Linientyp einer Linie festlegen. Mit geom_smooth() wird für jeden eindeutigen Wert der Variablen, den Sie dem Linientyp zuordnen, eine andere Linie mit einem anderen Linientyp gezeichnet:
ggplot(data = mpg) +
geom_smooth(mapping = aes(x = displ, y = hwy, linetype = drv))
Hier trennt geom_smooth() die Fahrzeugdaten in drei Linien, und zwar basierend auf dem Wert drv, der die Antriebstechnik eines Fahrzeugs beschreibt. Eine Linie beschreibt alle Punkte mit dem Wert 4, eine andere Linie alle Punkte mit dem Wert f und eine dritte Linie alle Punkte mit dem Wert r. Hierbei steht die 4 für Vierradantrieb, f für Frontantrieb (front-wheel drive) und r für Heckantrieb (rear-wheel drive).
Um dies klarer zu machen, legen wir die Linien über die Rohdaten und färben sie entsprechend dem Wert von drv.
Beachten Sie, dass dieses Diagramm zwei geometrische Objekte in derselben Grafik enthält! Falls Ihnen das zu aufregend ist, schnallen Sie sich an! Im nächsten Abschnitt lernen Sie, wie Sie mehrere geometrische Objekte im selben Diagramm unterbringen.
Allein im Paket ggplot2 sind über 30 geom-Objekte enthalten, Erweiterungspakete bieten sogar noch mehr (siehe http://exts.ggplot2.tidyverse.org mit Beispielen). Für einen umfassenden Überblick am besten geeignet ist der ggplot2-Spickzettel, den Sie unter https://www.rstudio.com/resources/cheatsheets finden. Wollen Sie mehr über ein bestimmtes geometrisches Objekt lernen, rufen Sie die Hilfe beispielsweise mit ?geom_smooth auf.
Viele geom-Objekte wie zum Beispiel geom_smooth() verwenden ein einzelnes geometrisches Objekt, um mehrere Datenzeilen anzuzeigen. Für diese geom-Objekte können Sie die visuelle Eigenschaft group auf eine kategoriale Variable festlegen, um mehrere Objekte zu zeichnen. ggplot2 zeichnet ein separates Objekt für jeden eindeutigen Wert der Gruppierungsvariablen. Praktisch gruppiert ggplot2 automatisch die Daten für diese geom-Objekte, wenn Sie eine visuelle Eigenschaft auf eine diskrete Variable abbilden (wie im linetype-Beispiel). Es ist komfortabel, sich auf dieses Feature zu verlassen, weil die visuelle Eigenschaft group an sich den geom-Objekten weder eine Legende noch Unterscheidungsmerkmale hinzufügt:
ggplot(data = mpg) +
geom_smooth(mapping = aes(x = displ, y = hwy))
ggplot(data = mpg) +
geom_smooth(mapping = aes(x = displ, y = hwy, group = drv))
ggplot(data = mpg) +
geom_smooth(
mapping = aes(x = displ, y = hwy, color = drv),
show.legend = FALSE
)
Um mehrere geometrische Objekte im selben Diagramm anzuzeigen, fügen Sie mehrere geom-Funktionen in ggplot() ein:
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy)) +
geom_smooth(mapping = aes(x = displ, y = hwy))
Allerdings bringt das doppelten Code mit sich. Nehmen Sie an, Sie möchten die y-Achse ändern, um cty anstelle von hwy anzuzeigen. Dann müssten Sie die Variable an zwei Stellen ändern, wobei Sie vielleicht vergessen, die eine zu aktualisieren. Derartige Wiederholungen lassen sich vermeiden, wenn Sie einen Satz von Zuordnungen an ggplot() übergeben. ggplot2 behandelt diese Zuordnungen als globale Zuordnungen, die für jedes geometrische Objekt im Diagramm gelten. Mit anderen Worten produziert der folgende Code das gleiche Diagramm wie der vorherige Code:
ggplot(data = mpg, mapping = aes(x = displ, y = hwy)) +
geom_point() +
geom_smooth()
Wenn Sie Zuordnungen in einer geom-Funktion unterbringen, behandelt ggplot2 sie als lokale Zuordnungen für die Ebene. Ich verwende diese Zuordnungen, um die globalen Zuordnungen nur für diese Ebene zu erweitern oder zu überschreiben. Dadurch ist es möglich, verschiedene visuelle Eigenschaften in verschiedenen Ebenen anzuzeigen:
ggplot(data = mpg, mapping = aes(x = displ, y = hwy)) +
geom_point(mapping = aes(color = class)) +
geom_smooth()
Nach dem gleichen Konzept können Sie verschiedene data für jede Ebene spezifizieren. Hier zeigt unsere glatte Linie lediglich eine Teilmenge aus dem mpg-Datenset an, die Fahrzeugkategorie subcompact (Kleinstwagen). Das lokale data-Argument in geom_smooth() überschreibt das globale data-Argument in ggplot() nur für diese Ebene:
ggplot(data = mpg, mapping = aes(x = displ, y = hwy)) +
geom_point(mapping = aes(color = class)) +
geom_smooth(
data = filter(mpg, class == "subcompact"),
se = FALSE
)
(Wie die Funktion filter() arbeitet, lernen Sie im nächsten Kapitel. Fürs Erste müssen Sie nur wissen, dass dieser Befehl nur die Fahrzeugkategorie subcompact auswählt.)