+ - 0:00:00
Notes for current slide
Notes for next slide

INPUT - OUTPUT Workshop R & RStudio

Deel 4

Krachtige visualisaties met ggplot2

Sven De Maeyer

03/05/2022

1 / 58

Overzicht

2 / 58

1. Eenvoudige plotjes in R

3 / 58

Plotjes uit base

De generieke plot() functie

plot(RIASEC$age)

4 / 58

Plotjes uit base

De generieke plot() functie

plot(table(RIASEC$Geslacht))

5 / 58

Plotjes uit base

De generieke plot() functie

plot(RIASEC$age, RIASEC$Conventional)

6 / 58

Plotjes uit base

De boxplot() functie

boxplot(RIASEC$Conventional)

7 / 58

Plotjes uit base

De hist() functie

hist(RIASEC$Conventional)

8 / 58

2. Grammar of Graphics

9 / 58

Een meer theoretische benadering van grafieken




  • Theoretisch uiteenrafelen van data visualisaties

  • Vormt de basis van verschillende moderne grafische applicaties:

    • ggplot2
    • Tableau (Polaris)
    • Vega-Lite

Slide gebaseerd op slides van Thomas Lin Pedersen https://github.com/thomasp85/ggplot2_workshop/blob/master/presentation.pdf

10 / 58

Centraal idee achter Grammar of Graphics

Slide uit slideshow van Thomas Lin Pedersen https://github.com/thomasp85/ggplot2_workshop/blob/master/presentation.pdf

11 / 58

Grammar of Graphics: Data

  • Data is niet enkel ruwe dataset (kan ook waarden van schattingen op basis van anlayses zijn)


Group Country Gender Mean_age Sd_age CI_lower CI_upper
BE Male BE Male 39 11.0 17.44 60.56
BE Female BE Female 41 13.2 15.13 66.87
BE Other BE Other 36 8.2 19.93 52.07
NL Male NL Male 37 12.0 13.48 60.52
NL Female NL Female 36 14.0 8.56 63.44
NL Other NL Other 31 7.2 16.89 45.11
  • Data hoort 'tidy' te zijn (enkel rijen en kolommen)
12 / 58

Grammar of Graphics: Mapping

= Verbinden van elementen van een grafiek met de Data


Aesthetic mapping

= de link tussen waarden voor een variabele in de Data en de 'geometry' (bv. hoogte van een balk; x-positie van een punt; kleur van punt; dikte van een punt; vorm van een punt)


Facet mapping

= de link tussen waarden voor een variabele in de Data en de panelen die in een grafiek worden onderscheiden (bv. apart paneel per land)

13 / 58

Grammar of Graphics: Statistics

  • Data is misschien wel tidy, maar wil niet zeggen dat de data-input van een graphic al meteen de juiste waarden bevatten die dienen te worden weergegeven

    • Bv. eerst beschrijvende statistieken berekenen om een boxplot te kunnen plotten
    • Bv. eerst een lineair (of ander) model schatten om een lijn doorheen puntenwolk te trekken
  • Vaak impliciet achter bepaalde types van grafieken

14 / 58

Grammar of Graphics: Scales

  • Data dient te worden vertaald naar 'grafische eigenschappen' (= Scales)

  • Voorbeelden:

    • Categorieën Kleuren;
    • Categorieën Vorm (driehoekje; bolletje; kruisje; ...);
    • Nummers Plaats (x- en y- coördinaten);
    • Nummers Grootte;
    • ...
  • Implicatie is dat waarde moeten op een bepaalde wijze geïnterpreteerd worden: discrete; continuous; ...

15 / 58

Grammar of Graphics: Geometries

  • Welke geometrische vormen zijn de basis van de grafische representatie?

  • Voorbeelden:

    • punten op een x- en y-assen stelsel;
    • boxplots;
    • polygonen;
    • een lijn;
    • ...
16 / 58

Grammar of Graphics: Facets

  • Hoeveel panelen worden weergegeven?

  • Hoe de panelen te definiëren?

17 / 58

3. Hoe werkt ggplot2?

18 / 58

Tijd om de pinguïns erbij te halen...

Leuke data (Bron: https://allisonhorst.github.io/palmerpenguins/articles/intro.html)

install.packages("palmerpenguins")
library(palmerpenguins)
data("penguins")

Artwork by @allison_horst

19 / 58

Tijd om de pinguïns erbij te halen...

Table 1. Random sample of 10 observations from the Palmer Pinguins dataset
species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex year
Gentoo Biscoe 47.4 14.6 212 4725 female 2009
Adelie Torgersen 35.1 19.4 193 4200 male 2008
Adelie Dream 40.2 17.1 193 3400 female 2009
Gentoo Biscoe 45.3 13.7 210 4300 female 2008
Adelie Biscoe 39.7 17.7 193 3200 female 2009
Adelie Biscoe 38.2 18.1 185 3950 male 2007
Adelie Dream 40.2 20.1 200 3975 male 2009
Adelie Biscoe 39.0 17.5 186 3550 female 2008
Adelie Torgersen 38.6 21.2 191 3800 male 2007
Adelie Torgersen 36.2 17.2 187 3150 female 2009
20 / 58

De basis ggplot2

Plot <- ggplot(
## Stap 1: de Data
data = penguins,
## Stap 2: Mapping
aes(
x = flipper_length_mm,
y = body_mass_g)
)
Plot

21 / 58

De basis ggplot2

Plot <- ggplot(
## Stap 1: de Data
data = penguins,
## Stap 2: Mapping
aes(
x = flipper_length_mm,
y = body_mass_g)
) +
## Stap 3: Geometries toevoegen
geom_point()
Plot

Merk op dat we enkel stappen van de Grammar of Graphics niet dienden te definiëren omdat ze allen logische default waarden hebben

22 / 58

De basis ggplot2 met meerdere facets

Plot <- ggplot(
## Stap 1: de Data
data = penguins,
## Stap 2: Mapping
aes(
x = flipper_length_mm,
y = body_mass_g)
) +
## Stap 3: Geometries toevoegen
geom_point() +
## Stap 4: Facets definiëren
facet_wrap(.~species)
Plot

23 / 58

Een visualisatie laten 'groeien' door laagjes toe te voegen ...

24 / 58

De verschillende geom_* opties

De cheatsheet: https://github.com/rstudio/cheatsheets/blob/main/data-visualization-2.1.pdf

25 / 58

4. Categorische variabele visueel samenvatten met ggplot2

"de bar is open"

26 / 58

Barplot maken met geom_bar()

  • species op de x-as zetten
  • geom_bar()
  • op de achtergrond worden aantallen automatisch geteld (= stat_count())
ggplot(penguins,
aes(
x = species
)) +
geom_bar()

27 / 58

Barplot maken met geom_col()

  • Heb je reeds samengevatte data, dan kan je geom_col() hanteren.
Teldata <- penguins %>%
count(species, name = 'Aantal')
ggplot(Teldata,
aes(
x = species,
y = Aantal
)) +
geom_col()
## # A tibble: 3 × 2
## species Aantal
## <fct> <int>
## 1 Adelie 152
## 2 Chinstrap 68
## 3 Gentoo 124

28 / 58

Barplot maken met geom_bar()

  • Kleur toevoegen door een extra schaal te definiëren: de fill
ggplot(penguins,
aes(
x = species
)) +
geom_bar(
## Extra mapping: de "fill" schaal
aes(fill = species)
)

29 / 58

Barplot maken met geom_bar()

  • Kleurenpallette manueel bepalen adhv extra laag met scale_fill_manual()
ggplot(penguins,
aes(
x = species
)) +
geom_bar(
aes(fill = species)
) +
# Zelf kleuren kiezen
scale_fill_manual(
values = c("darkorange","purple","cyan4")
)

30 / 58

Barplot maken met geom_bar()

  • titels toevoegen/veranderen met extra laag labs()
ggplot(penguins,
aes(
x = species
)) +
geom_bar(
aes(fill = species)
) +
scale_fill_manual(
values = c("darkorange","purple","cyan4")
) +
# Labs laag voor titels en x-as label
labs(
title = "Palmer penguins",
subtitle = "n observations for species",
x = ""
)

31 / 58

Barplot maken met geom_bar()

  • ander theme hanteren theme_minimal()
ggplot(penguins,
aes(
x = species
)) +
geom_bar(
aes(fill = species)
) +
scale_fill_manual(
values = c("darkorange","purple","cyan4")
) +
labs(
title = "Palmer penguins",
subtitle = "n observations for species",
x = ""
) +
# Ander thema kiezen
theme_minimal()

32 / 58

Barplot maken met geom_bar()

  • de richting omdraaien coord_flip()
  • legende verwijderen theme(legend.position = "none")
ggplot(penguins,
aes(
x = species
)) +
geom_bar(
aes(fill = species)
) +
scale_fill_manual(
values = c("darkorange","purple","cyan4")
) +
labs(
title = "Palmer penguins",
subtitle = "n observations for species",
x = ""
) +
coord_flip( ) +
theme_minimal( ) +
theme(
legend.position = "none"
)

33 / 58

Oefeningen [ggplot2] : deel 1

  • Op Dropbox vind je een document Oefening_ggplot2.Rmd

  • Plaats dit document op je pc

  • Open vervolgens het bestand in R Studio

  • Het document bevat een set van opdrachten met telkens lege code blokken

  • Bedoeling is dat je de juiste code schrijft (en test door te laten lopen) om deze opdrachten uit te voeren

  • Zit je vast? No Worries!

    • Ik ben er
    • Je hebt elkaar
    • Er is een oplossingssleutel Oefening_ggplot2_oplossing.Rmd
35 / 58

5. Kwantitatieve variabelen visualiseren met ggplot2

36 / 58

Histogram met geom_histogram()

ggplot(penguins,
aes(
x = flipper_length_mm,
)) +
geom_histogram()

37 / 58

Histogram met geom_histogram()

  • gepimpte versie
ggplot(penguins,
aes(
x = flipper_length_mm,
fill = species
)) +
geom_histogram(
alpha = .7
) +
scale_fill_manual(
values = c("darkorange","purple","cyan4")
) +
labs(
title = "Palmer penguins",
subtitle = "Histogram voor flipper lengte",
x = "Flipper lengte"
) +
theme_minimal()

38 / 58

Density plot met geom_density()

  • density plot (oppervlakte onder de curve = 100%)
ggplot(penguins,
aes(
x = flipper_length_mm,
fill = species
)) +
geom_density(
alpha = .7
) +
scale_fill_manual(
values = c("darkorange","purple","cyan4")
) +
labs(
title = "Palmer penguins",
subtitle = "Density plot voor flipper lengte",
x = "Flipper lengte"
) + theme_minimal()

39 / 58

Of beter nog geom_violin() + geom_jitter()

ggplot(penguins,
aes(
x = species,
y = flipper_length_mm,
fill = species,
color = species
)) +
geom_violin(
alpha = .65
) +
geom_jitter(
alpha = .7
) +
scale_fill_manual(
values = c("darkorange","purple","cyan4")
) +
scale_color_manual(
values = c("darkorange","purple","cyan4")
) +
labs(
title = "Palmer penguins",
subtitle = "Density plot voor flipper lengte",
y = "Flipper lengte",
x = "",
) + theme_minimal() + theme(legend.position = "none")

40 / 58

Of een raincloud plot

Gebaseerd op de tutorial van Cédric Scherer: https://www.cedricscherer.com/

41 / 58

Of een raincloud plot (Appendix 1: regenwolken laten groeien)

Extra pakket nodig: ggdist

library(ggdist)
ggplot(penguins, aes(x = species, y = flipper_length_mm)) +
stat_halfeye(
adjust = .5,
width = .6,
.width = 0,
justification = -.2,
point_colour = NA
) +
geom_boxplot(
width = .15,
outlier.shape = NA
) +
geom_point(
size = 1.3,
alpha = .3,
position = position_jitter(
seed = 1, width = .1
)) +
labs(
title = "Palmer penguins",
subtitle = "Verdeling van flipper lengte per soort",
x = "",
y = "flipper lengte"
) +
coord_cartesian(xlim = c(1.2, NA), clip = "off") +
coord_flip() +
theme_minimal()
42 / 58

Oefeningen [ggplot2] : deel 2

  • Op Dropbox vind je een document Oefening_ggplot2.Rmd

  • Plaats dit document op je pc

  • Open vervolgens het bestand in R Studio

  • Het document bevat een set van opdrachten met telkens lege code blokken

  • Bedoeling is dat je de juiste code schrijft (en test door te laten lopen) om deze opdrachten uit te voeren

  • Zit je vast? No Worries!

    • Ik ben er
    • Je hebt elkaar
    • Er is een oplossingssleutel Oefening_ggplot2_oplossing.Rmd
43 / 58

6. Samenhang visualiseren met ggplot2

44 / 58

De puntenwolk met geom_point()

ggplot(penguins,
aes(
x = body_mass_g,
y = flipper_length_mm
)) +
geom_point( ) +
labs(
title = "Palmer penguins",
subtitle = "Samenhang tussen flipper lengte en body mass",
y = "Flipper lengte",
x = "Body mass",
) + theme_minimal() + theme(legend.position = "none")

45 / 58

De puntenwolk met geom_point() en geom_smooth()

ggplot(penguins,
aes(
x = body_mass_g,
y = flipper_length_mm
)) +
geom_point( ) +
geom_smooth( ) +
labs(
title = "Palmer penguins",
subtitle = "Samenhang tussen flipper lengte en body mass",
y = "Flipper lengte",
x = "Body mass",
) + theme_minimal() + theme(legend.position = "none")

46 / 58

De puntenwolk met geom_point() en geom_smooth()

  • zonder confidentie interval
  • lineair model
ggplot(penguins,
aes(
x = body_mass_g,
y = flipper_length_mm
)) +
geom_point( ) +
geom_smooth(
method = "lm",
se = FALSE
) +
labs(
title = "Palmer penguins",
subtitle = "Samenhang tussen flipper lengte en body mass",
y = "Flipper lengte",
x = "Body mass",
) + theme_minimal() + theme(legend.position = "none")

47 / 58

De puntenwolk met geom_point() en geom_smooth()

  • een facet per soort dankzij facet_wrap()
ggplot(penguins,
aes(
x = body_mass_g,
y = flipper_length_mm
)) +
geom_point( ) +
geom_smooth(
method = "lm",
se = FALSE
) +
facet_wrap(.~species) +
labs(
title = "Palmer penguins",
subtitle = "Samenhang tussen flipper lengte en body mass",
y = "Flipper lengte",
x = "Body mass",
) + theme_minimal() + theme(legend.position = "none")

48 / 58

De puntenwolk met geom_point() en geom_smooth()

ggplot(data = penguins,
aes(x = flipper_length_mm,
y = body_mass_g)) +
geom_point(aes(color = species,
shape = species),
size = 3,
alpha = 0.8) +
geom_smooth(
aes(color = species),
se = F, method = "lm"
) +
theme_minimal() +
scale_color_manual(
values = c("darkorange","purple","cyan4")) +
labs(title = "Penguin size, Palmer Station LTER",
subtitle = "Flipper lengte en body mass voor Adelie, Chinstrap en Gentoo Pinguïns",
x = "Flipper lengte (mm)",
y = "Body mass (g)",
color = "Penguin soort",
shape = "Penguin soort") +
theme(legend.position = c(0.2, 0.7),
legend.background = element_rect(fill = "white", color = NA),
plot.title.position = "plot",
plot.caption = element_text(hjust = 0, face= "italic"),
plot.caption.position = "plot")

49 / 58

Oefeningen [ggplot2] : deel 3

-- Op Dropbox vind je een document Oefening_ggplot2.Rmd

  • Plaats dit document op je pc

  • Open vervolgens het bestand in R Studio

  • Het document bevat een set van opdrachten met telkens lege code blokken

  • Bedoeling is dat je de juiste code schrijft (en test door te laten lopen) om deze opdrachten uit te voeren

  • Zit je vast? No Worries!

    • Ik ben er
    • Je hebt elkaar
    • Er is een oplossingssleutel Oefening_ggplot2_oplossing.Rmd
50 / 58

Appendix 1

Regenwolken laten groeien




Terug naar slideshow...

51 / 58

Stap 1

library(ggdist)
P1 <-
ggplot(penguins, aes(x = species, y = flipper_length_mm)) +
stat_halfeye(
)
P1

52 / 58

Stap 2

P1 <-
ggplot(penguins, aes(x = species, y = flipper_length_mm)) +
stat_halfeye(
adjust = .5,
width = .6,
.width = 0,
justification = -.2,
point_colour = NA
)
P1

53 / 58

Stap 3

P2 <- P1 +
geom_boxplot(
width = .15,
outlier.shape = NA
)
P2

54 / 58

Stap 4

P3 <- P2 +
geom_point(
size = 1.3,
alpha = .3,
position = position_jitter(
seed = 1, width = .1
))
P3

55 / 58

Stap 5

P4 <- P3 +
labs(
title = "Palmer penguins",
subtitle = "Verdeling van flipper lengte per soort",
x = "",
y = "flipper lengte"
)
P4

56 / 58

Stap 6

P5 <- P4 +
coord_cartesian(xlim = c(1.2, NA), clip = "off") +
coord_flip() +
theme_minimal() +
theme(plot.title.position = "plot")
P5

57 / 58

AANSCHOUW DE REGENWOLKEN / Terug naar slideshow...

58 / 58

Overzicht

2 / 58
Paused

Help

Keyboard shortcuts

, , Pg Up, k Go to previous slide
, , Pg Dn, Space, j Go to next slide
Home Go to first slide
End Go to last slide
Number + Return Go to specific slide
b / m / f Toggle blackout / mirrored / fullscreen mode
c Clone slideshow
p Toggle presenter mode
t Restart the presentation timer
?, h Toggle this help
Esc Back to slideshow