Hier sollen Beispiele der Datenvisualisierung gezeigt werden. Die Beispiele folgen dem Buch: “R for Data Science” von Hadley Wickham und Garret Grolemund. Der Link zum freien Onlinebuch finden Sie hier: https://r4ds.had.co.nz/index.html
(Edit: 22.Dez. 2023.) Es gibt auch davon schon eine zweite Auflage, die ebenfalls frei online verfügbar ist: https://r4ds.hadley.nz/. In weiterer Folge werde ich mich an die Beispiele der zweiten Auflage halten. Ich habe das zweite Kapitel dieses Buches ausgelassen, da in diesem Kapitel nochmals kurz auf das Basiswissen eingegangen wird. Dafür gibt es andere, weit ausführlichere Quellen, wie zb: http://www.cookbook-r.com/.
Das ist weitgehend eine Lernseite für mich selbst, um in R besser zu werden. Ich halte mich, so weit es geht, an die Codes im Buch, werde aber hin und wieder abweichen, da ich mit dem Code “herumspielen” werde. Die Seite wird von mir unregelkmäßig aktualisierrt. R Code steht in leicht grau hinterlegten Feldern. Weiße Felder zeigen den Output des Befehles oder Wahrnhinweise. Weitere Informationen zum Package findet man unter folgendem Link zusammengefasst: https://www.tidyverse.org/
Eine weitere sehr gute Hompage für Datenvisualisierung mit ggplot2 ist: https://r-graph-gallery.com/ggplot2-package.html
Hier wird zuerst die Umgebung gelöscht. Danach werden die benötigten Libraries eingelesen. Aktuell ist nur die tidyverse Bibliothek wichtig. Es umfasst alle anderen Libraries, die für die Erstellung von Grafiken und Datenanalysen benötigt werden. In Auflage 2 wird ein weiterer Datensatz - palmerpenguins- benötigt. Der muss mit einer weiteren Library -ggthemes- zusätzlich geladen werden.
# Löscht alle einträge
rm(list = ls())
# Einlesen der Libraries, die benötigt werden
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.4
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.4.4 ✔ tibble 3.2.1
## ✔ lubridate 1.9.3 ✔ tidyr 1.3.0
## ✔ purrr 1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
# weitere Libraries aus Auflage 2.
library(ggthemes)
library(palmerpenguins)
library(knitr) # für die Tabellen
Der Datensatz, mpg, ist in R defaultmäßig integierert und wird in weiterer Folge verwendet. Der Datensatz umfasst Autodaten über Spritwirtschaftlichkeit von 1999 bis 2008, die die US-Umweltbehörde EPA auf folgendem Link öffentlich macht: https://fueleconomy.gov/
head(mpg)
## # A tibble: 6 × 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(l5) f 18 29 p compa…
## 2 audi a4 1.8 1999 4 manual(m5) f 21 29 p compa…
## 3 audi a4 2 2008 4 manual(m6) f 20 31 p compa…
## 4 audi a4 2 2008 4 auto(av) f 21 30 p compa…
## 5 audi a4 2.8 1999 6 auto(l5) f 16 26 p compa…
## 6 audi a4 2.8 1999 6 manual(m5) f 18 26 p compa…
Hier werden die ersten Grafiken dargestellt. Der Code bleibt eingeblendet. Zur Erstellung der Grafiken wird die Library ggplot2 verwendet. Weitere nützliche Informationen zu diesem R-Package findet man unter folgender Seite: https://ggplot2.tidyverse.org/
Es sollte die Beziehung zwischen der zu erklärenden Variablen, hwy, welche den Verbrauch in Meilen pro Galone mißt, und der erklärenden Variable, disp, welcher den Hubraum in ccm darstellt. Die Grafik ist recht einfach gehalten. Im Befehl ggplot() werden die Basisinformationen festgelegt. In diesem Beispiel ist es nur der Datensatz. Danach wird die Grafik selbst gewählt. Hier ist es der befehl geom_point() verwendet. Mit dem Befehl aes -Aestetics- werden die visuellen Eigenschaften der Grafik festgelegt. In diesem Beispiel ist es nur die x- bzw. y-Achse.
# 2.0.1 Erster, simpler ggplott
ggplot(data = mpg) + # ggplot ist immer die Eröffnungsphrase
geom_point(aes(x = displ, # displ ist der hubraum
y = hwy)) # Verbrauch auf der Autobahn in Meilen pro Galone
Es gibt, wie auch angenommen, einen negativen Zusammenhang zwischen dem Verbrauch und der Motorgröße. Je größer der Motor, desto weniger Meilen können mit einer Galone zurückgelegt werden.
Im einfachen Diagram werden alle Fahrzeugtypen zusammengefasst. Im nächsten Beispiel soll noch zwischen den einzelnen Fahrzeugklassen unterschieden werden. Dafür werden die Einzellnen Fahrzeugklassen farblich unterschieden. Der Befehl, aes, wird um eine weitere Eigenschaft der Grafik, Fahrzeugklassen werden farblich unterschieden, erweitert
# 2.0.2 Der gleiche Plott mit einer farblichen unterscheidung der Aufbauarten der Autos
ggplot(data = mpg) +
geom_point(aes(x = displ,
y = hwy,
color = class))
Der Code ändert sich nur im aes-Befehl. Dabei werden die Klassen unterschiedlich große Punkte zugeteilt.
# 2.0.2 Unterscheidung der Fahrzeigklasse durch die Größe der Punkte
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ,
y = hwy,
size = class),
na.rm = T) # falls keine werte vorhanden, werden sie nicht einbezogen
## Warning: Using size for a discrete variable is not advised.
Hier werden der Body Mass und die Flossengrösse verglichen. Es soll nach der Pinguinart unterschieden werden.
zuerst soll der Anfang des Data Frames als tabelle dargestellt werden
kable(penguins[1:7, #nur die ersten 7 Zeilen des DF werden dargestellt
], caption = "Anfang des Pinguins Data Frame")
| species | island | bill_length_mm | bill_depth_mm | flipper_length_mm | body_mass_g | sex | year |
|---|---|---|---|---|---|---|---|
| Adelie | Torgersen | 39.1 | 18.7 | 181 | 3750 | male | 2007 |
| Adelie | Torgersen | 39.5 | 17.4 | 186 | 3800 | female | 2007 |
| Adelie | Torgersen | 40.3 | 18.0 | 195 | 3250 | female | 2007 |
| Adelie | Torgersen | NA | NA | NA | NA | NA | 2007 |
| Adelie | Torgersen | 36.7 | 19.3 | 193 | 3450 | female | 2007 |
| Adelie | Torgersen | 39.3 | 20.6 | 190 | 3650 | male | 2007 |
| Adelie | Torgersen | 38.9 | 17.8 | 181 | 3625 | female | 2007 |
als Grafik (weiterer Text folgt):
# Pinguin DS
ggplot(data = penguins,
mapping = aes(x = flipper_length_mm,
y = body_mass_g
)) +
geom_point(mapping = aes(color = species, # Die Arten farblich unterscheiden
shape = species),
na.rm = T) + # Den arten auch eine Punktform zuweisen
geom_smooth(method = lm,
na.rm = T) + # Es sollte eine lineare Regression dargestellt werden
theme(plot.caption = element_text(hjust = 0))+ # caption ist normalerweise rechts ausgerichtet. mit dem Befehl ist sie links
labs( #hier erden die Beschriftiungen der Grafik eingefügt
title = "Vergleich des Gewichtes in Gramm zur Flossengröße",
subtitle = "Verglichen werden drei Pinguinarten",
x = " Flossengröße (in mm)",
y = " Gewicht (in gr)",
caption = "Quelle: https://r4ds.hadley.nz/data-visualize"
)
## `geom_smooth()` using formula = 'y ~ x'
Wieder drei Regressionen machen. Für jede Spezies eine Regression.
ggplot(data = penguins,
mapping = aes(x = flipper_length_mm,
y = body_mass_g,
color = species)) +
geom_point(mapping = aes(shape = species),
na.rm = T) + # Den arten auch eine Punktform zuweisen
geom_smooth(method = lm,
na.rm = T) + # Es sollte eine lineare Regression dargestellt werden
theme(plot.caption = element_text(hjust = 0))+ # caption ist normalerweise rechts ausgerichtet. mit dem Befehl ist sie links
labs( #hier erden die Beschriftiungen der Grafik eingefügt
title = "Vergleich des Gewichtes in Gramm zur Flossengröße",
subtitle = "Verglichen werden drei Pinguinarten. Hier mit drei linearen Regressionen",
x = " Flossengröße (in mm)",
y = " Gewicht (in gr)",
caption = "Quelle: https://r4ds.hadley.nz/data-visualize"
)
## `geom_smooth()` using formula = 'y ~ x'
# 2.0.3 Mit alpha = werden die Punkte in unterschiedlicher Transparenz zugeordnet
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ,
y = hwy,
alpha = class),
color = "darkblue") # Ausserhalb des aes-Befehls bezeichnet color = die Farbe der Punkte
## Warning: Using alpha for a discrete variable is not advised.
# 2.0.4 Unterschiedliche Formen an "Punkten"
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ,
y = hwy,
shape = class),
na.rm = T)
## 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 have them.
Um die jeweilige Klasse in einen individuellen Graph darzustellen wird der Befehl facet_wrap verwendet.
# 2.1.0 Die Klassen auf unterschiedliche Graphen aufteilen.
ggplot(data = mpg) +
geom_point(aes(x = displ,
y = hwy,
color = class),
na.rm = T) +
facet_wrap(~ class, # Der Befehl teilt die einzelnen Klaasen in eine eigene Grafik
nrow = 3) # Anzahl der Spalten
Hier sollen die individuellen Graphen mit 2 Variablen weiter aufgeteilt werden. In diesem Beispiel wird der Basisdatensatz noch zwischen Zylindern- 4 bis 8 Zylinder, auf der x-Achse - und dem Antriebsart - 4, f, r- aufgeteilt.
# 2.1.1 Individuelle Graphen mit zwei Variablen
ggplot(data = mpg) +
geom_point(aes(x = displ,
y = hwy,
color = class),
na.rm = T) +
facet_grid(drv ~ cyl)
Die gleichen Daten können auch als Liniendiagram, eine Art von Regression, darstellen
ggplot(data = mpg) +
geom_point(aes(x = displ,
y = hwy))
ggplot(data = mpg) +
geom_smooth(aes(x = displ,
y = hwy))
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
ggplot(data = mpg) +
geom_smooth(aes(x = displ,
y = hwy,
linetype = drv))
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
Hier wurden drei Regressionen generiert. Es wird dabei nach den Antriebsarten des Autos unterschieden. Im Befehl geom_smooth() wird im Argument linetype die Variable drv (Antriebsart) zugeordnet
Dabei werden im Plot beide Grafiken, die Punktwolke über geom_point() und die Regressionsgeraden geom_smooth() übereinander legen
ggplot(data = mpg,
mapping =aes(x = displ,
y = hwy,
color = drv)
)+
geom_point() +
geom_smooth(mapping = aes(linetype = drv))
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
### 2.2.2 Nur eine Klasse als Regressionslinie darstellen
ggplot(data = mpg,
mapping = aes(x = displ,
y = hwy,
color = class)
)+
geom_point() +
geom_smooth(data = filter(mpg, # es wird nach der klasse gefiltert
class == "subcompact"),
se = FALSE) # standardfehler wird nicht angezeigt
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
text folgt
# mit mehreren Variablen arbeiten
ggplot(penguins,
aes(x = flipper_length_mm,
y = body_mass_g,
color = species,
shape = island)) +
geom_point()
## Warning: Removed 2 rows containing missing values (`geom_point()`).
# aufgeteilt in facets
ggplot(penguins,
aes(x = flipper_length_mm,
y = body_mass_g,
color = species,
shape = island)) +
geom_point() +
facet_grid(~ island)
## Warning: Removed 2 rows containing missing values (`geom_point()`).
DS ist diamonds (Text folgt)
# 2.3.1 Einfaches Balkendiagramme mit dem Datensats "diamonds)
ggplot(data = diamonds,
mapping = aes( x= cut)) +
geom_bar()
Gleicher graph mit stat_count()
ggplot(data = diamonds,
mapping = aes(x = cut)) +
stat_count()
Text folgt
demo <- diamonds %>%
count(cut) %>%
rename("Anzahl" = "n") %>%
arrange(str_rank(cut))
ggplot(data = demo) +
geom_bar(mapping = aes(x = cut,
y = Anzahl),
stat = "identity",
color = "red",
fill = "red")
Weiterer (ausführlicherer) Text folgt. Hier wird als x-Wert die kathegorische Variable, island, noch weiter, durch die kathegorische Variable, species, unterteilt.
# Balken diagram mit zwei kathegorischen variablen island und species
ggplot(penguins,
aes(x = island,
fill = species)) +
geom_bar()
Die gleichen Daten können auch als “100% Balken dargestellt werden. Dabei wird die Pinguinpopulation der jeweiligen Insel als 100% Balken dargestellt:
# Balkendiagram auf 100%
ggplot(penguins,
aes(x = island,
fill = species)) +
geom_bar(position = "fill") + # Erzeugt die Grafik auf 100%
labs(title = "Aufschlüsselung der Pinguinpopulation jeh Insel nach Spezies",
y = "Anzahl",
x = "Insel")
Weiterer Text folgt
# einfaches histogram
ggplot(penguins,
aes(x = body_mass_g)) +
geom_histogram(binwidth = 150,
na.rm = T,
fill = "red") +
geom_density(color = "darkblue")
## Warning: Removed 2 rows containing non-finite values (`stat_density()`).
Text folgt
####
# 1 5 Zusamenhänge in der Visualisierung
# bspl boxplot
ggplot(penguins,
aes(x = species,
y = body_mass_g)) +
geom_boxplot()
## Warning: Removed 2 rows containing non-finite values (`stat_boxplot()`).
Text folgt
ggplot(penguins,
aes( x= body_mass_g,
color = species,
fill = species)) +
geom_density(linewith = 0.7,
alpha = 0.5)
## Warning in geom_density(linewith = 0.7, alpha = 0.5): Ignoring unknown
## parameters: `linewith`
## Warning: Removed 2 rows containing non-finite values (`stat_density()`).
Link zum nächsten Kapittel https://rpubs.com/Exilkaerntner1970/1133217