library(tidyverse) # Dit laadt ggplot2, waarmee we de grafieken maken
library(scales) # Dit laadt scales
library(openintro) # We maken gebruik van data uit het package openintro
8 Grafieken maken met ggplot2
Het package ggplot2 biedt de meest consistente en flexibele manier om grafieken te maken in R. We zullen ons concentreren op de basisgrafiektypes aan de hand van voorbeelden. Dit is wat we verwachten dat je in staat bent om te doen.
Meer gedetailleerde opties zijn te vinden op de ggplot2 website en cheat sheet, maar dit is geen examenstof.
We gebruiken ook het package scales. Dit package geeft ons extra opties voor transformaties en om de labels, en kleurpaletten aan te passen.
We laden de benodigde packages als volgt:
We maken gebruik van de dataset loan50
die deel uitmaakt van het package openintro
met behulp van de functie data
.
data(loan50)
Onthoud dat we de functie data
alleen kunnen gebruiken voor datasets die bij een package horen. Voor het laden van datasets vanuit een bestand zie Paragraaf 1.7.2.
8.1 Algemene inleiding tot ggplot
Plots met ggplot 2 worden ontworpen in lagen (layers).
Elke ggplot begint met de ggplot
functie, waarin je de dataset definieert die wordt gebruikt en de belangrijkste variabelen. Bijvoorbeeld in de grafiek hieronder definiëren we loan50
als de data
. Vervolgens koppelen (“mapping”) we de variabelen die we gebruiken met behulp van de aes
functie, die variabelen koppelt aan elementen van de grafiek. In onderstaand voorbeeld geven we aan dat we de variabele total_income
op de x-as willen gebruiken en loan_amount
op de y-as.
ggplot(data = loan50,
mapping = aes(x = total_income, y = loan_amount))
De bovenstaande code produceert een ‘lege’ grafiek, omdat we R nog niet hebben verteld wat voor soort grafiek we willen produceren: misschien een lijngrafiek, een puntenwolk of iets anders? We moeten een geom
-laag aan de grafiek toevoegen om punten, lijnen of balken in de grafiek te kunnen produceren. Hieronder voegen we punten toe aan de grafiek met geom_point()
. Merk op dat we ook een plusteken (+
) toevoegen na de tweede regel, die ervoor zorgt dat we de punten toevoegen aan onze grafiek:
ggplot(data = loan50,
mapping = aes(x = total_income, y = loan_amount)) +
geom_point()
We kunnen ook extra lagen toevoegen om de grafiek er anders uit te laten zien, labels te veranderen of andere elementen aan de grafiek toe te voegen. Voorbeelden hiervan vind je voor elk van de grafiektypes hieronder.
8.1.1 Een ggplot opslaan in een bestand
Als je een grafiek wilt gebruiken in bijvoorbeeld een Word-document of Powerpoint, kun je de ggplot exporteren met ggsave
. Dit slaat de laatste ggplot op in een bestand:
ggplot(data = loan50,
mapping = aes(x = total_income, y = loan_amount)) +
geom_point()
ggsave(filename = "scatterplot_example.png",
width=7,
height=7)
filename = "scatterplot_example.png"
-
Je moet het bestand een naam en een extensie geven. In dit voorbeeld is de bestandsnaam ingesteld op
scatterplot_example.png
. Dit maakt een PNG-bestand, wat vaak goed werkt als je de grafiek wilt gebruiken in een tekstdocument of presentatie. Je kunt ook andere bestandsformaten maken, zoals eenjpeg
ofpdf
bestand, door de extensie te veranderen, bijvoorbeeldscatterplot_example.pdf
. width = 7
-
Dit geeft de breedte van de grafiek in inches.
height = 7
-
Geeft de hoogte van de grafiek in inches.
8.2 Puntenwolk (scatterplot)
Een puntenwolk geeft een overzicht van elk uniek punt voor twee numerieke waarden. Dit werkt vooral goed als er veel unieke waarden zijn.
In het onderstaande voorbeeld zetten we total_income
op de x-as (horizontaal) en loan_amount
op de y-as (verticaal).
ggplot(data = loan50,
mapping = aes(x = total_income, y = loan_amount)) +
geom_point()
data = loan50
-
Dit stukje code zegt dat het dataframe dat we gebruiken
loan50
heet. Voor je eigen grafiek zou jeloan50
vervangen door de naam van het data.frame dat je gebruikt. mapping = aes(x = total_income, y = loan_amount)
-
Dit deel van de code geeft aan dat
total_income
de variabele is die we willen weergeven op de x-as enloan_amount
moet worden weergegeven op de y-as. Voor je eigen grafiek zou je dustotal_income
enloan_amount
vervangen door je eigen variabelen. geom_point()
-
Dit vertelt ggplot2 dat we een scatterplot willen maken met punten voor de twee variabelen. We hebben geen extra argumenten nodig voor een eenvoudige scatterplot.
8.2.1 Puntenwolk: extra opties
Om de scatterplot er wat mooier uit te laten zien, kunnen we extra opties toevoegen. Om opties aan een plot toe te voegen gebruiken we het +
teken aan het eind van de regel:
data(loan50)
ggplot(data = loan50,
mapping = aes(x = total_income, y = loan_amount)) +
geom_point(size=2, colour = "grey") +
labs(title = "Total income and loan amount",
x = "Total Income",
y = "Loan Amount") +
scale_x_continuous(labels=label_dollar()) +
scale_y_continuous(labels=label_dollar()) +
theme_minimal()
geom_point(size = 2, colour = "grey")
-
Met deze opties kunnen we de grootte en de kleur van de stippen instellen. Merk op dat de kleurnaam een character vector is en tussen aanhalingstekens moet worden geplaatst: “grey”.
labs(title = "Title", x = "x axis title", y = "y axis title")
-
Deze optie voegt mooiere namen toe voor de titel van de grafiek, en de titels van de x- en y-as.
scale_x_continuous(labels=scales::label_dollar())
-
Deze optie en haar ‘zusje’
scale_y_continuous
veranderen hoe de waarden en assen worden weergegeven. In dit geval willen we de waarden in dollars weergeven. Dit kan worden gedaan metlabel_dollar()
uit packagescales
. theme_minimal()
-
Om het uiterlijk van een grafiek te veranderen, kun je de
theme_*
functies gebruiken (waarbij je in plaats van ster verschillende opties kunt toevoegen, zoalstheme_minimal()
,theme_classic()
oftheme_light()
.
8.2.2 Puntenwolk: meerdere groepen
Soms heb je verschillende groepen in je gegevens die je zou willen visualiseren. In dat geval kan je geom_point
aanpassen om de kleur of de vorm van de punten per groep te veranderen. In dit voorbeeld zal de kleur van de punt aangeven om wat voor type huiseigenaar het gaat:
data(loan50)
ggplot(data = loan50,
mapping = aes(x = total_income, y = loan_amount)) +
geom_point(aes(colour = homeownership))
geom_point(aes(colour = homeownership))
-
Dit geeft aan dat de
kleur
van de punten zal variëren per categorie vanhomeownership
(huur, hypotheek, eigen huis). R zal automatisch een kleur (colour
) kiezen voor elke groep. Voor je eigen grafiek, zou jehomeownership
veranderen in je eigen groeperingsvariabele. Opmerking: vergeet niet omcolour = homeownership
inaes()
te zetten.
data(loan50)
ggplot(data = loan50,
mapping = aes(x = total_income, y = loan_amount)) +
geom_point(aes(shape = homeownership))
geom_point(aes(shape = homeownership))
-
Dit geeft aan dat de vorm (
shape
) van de punten zal variëren per categorie vanhomeownership
. R zal automatisch eenshape
kiezen voor elke groep. Voor uw eigen grafiek, zou uhomeownership
veranderen in uw eigen groeperingsvariabele. Opmerking: vergeet niet omshape = homeownership
inaes()
te zetten.
8.2.3 Puntenwolk: afzonderlijke grafieken per groep
Soms wil je, in plaats van verschillende kleuren of vormen voor een groep te gebruiken, een aparte grafiek voor elke groep maken. Deze worden “facetten” (facets) genoemd en kunnen als volgt worden gemaakt:
data(loan50)
ggplot(data = loan50,
mapping = aes(x = total_income, y = loan_amount)) +
geom_point() +
facet_wrap(vars(homeownership))
facet_wrap(vars(homeownership))
-
Dit geeft aan dat we een apart “facet” willen produceren voor elke waarde van
woningbezit
(huur, hypotheek, eigen). Voor uw eigen grafiek, zou uhomeownership
veranderen in uw eigen groeperingsvariabele. Opmerking: vergeet niet om de variabele naam invars()
te zetten. Er zijn extra opties voor de functiefacet_wrap
om te bepalen hoe deze worden weergegeven, bijvoorbeeld het aantal rijen (nrow
) en kolommen (ncol
).
8.3 Dot plot
Een dot plot vat de waarden voor een enkele variabele samen.
ggplot(data = loan50,
mapping = aes(x = interest_rate)) +
geom_dotplot()
Bin width defaults to 1/30 of the range of the data. Pick better value with
`binwidth`.
data = loan50
-
Dit stukje code zegt dat het dataframe dat we gebruiken
loan50
heet. Voor je eigen grafiek zou jeloan50
vervangen door de naam van het data.frame dat je gebruikt. mapping = aes(x = interest_rate)
-
Dit deel van de code zegt dat
interest_rate
de variabele is die we willen weergeven. Voor je eigen grafiek zou je dusinterest_rate
vervangen door je eigen variabele. geom_dotplot()
-
Dit vertelt ggplot2 dat we een dotplot willen maken. We hebben geen bijkomende opties nodig voor een basis dotplot.
8.3.1 Dot plot: extra opties
ggplot(data = loan50,
mapping = aes(x = interest_rate)) +
geom_dotplot() +
labs(title = "Dot plot of interest rate",
x = "Interest rate",
y = "") +
scale_y_continuous(labels=NULL) +
scale_x_continuous(labels = label_percent(scale=1),
breaks=seq(5,25,by=5)) +
theme_minimal()
Bin width defaults to 1/30 of the range of the data. Pick better value with
`binwidth`.
labs(title = "Title", x = "x axis title", y = "")
-
Deze optie voegt mooiere namen toe voor de titel van de grafiek, en de titels van de x- en y-as. In het voorbeeld verwijderen we de titel van de y-as door hem op niets te zetten (
""
) scale_x_continuous(labels = label_percent(scale=1), breaks=seq(5,25,by=5)
-
Deze optie verandert hoe de x-as wordt weergegeven. In dit geval willen we de waarden in percentages weergeven. Dit kan gedaan worden met
label_percent(scale = 1)
uit packagescales
. We stellen ookbreaks=seq(5,25, by=5)
in om R te vertellen dat we de waarden van de x-as willen weergeven op 5%, 10%, 15%, 20% en 25%. theme_minimal()
-
Om het uiterlijk van een grafiek te veranderen, kun je de
theme_*
functies gebruiken (waarbij je in plaats van ster verschillende opties kunt toevoegen, zoalstheme_minimal()
,theme_classic()
oftheme_light()
.
8.4 Histogram
Een histogram geeft een overzicht van een numerieke variabele, door de tellingen van (gegroepeerde) waarden weer te geven.
ggplot(data = loan50,
mapping = aes(x = interest_rate)) +
geom_histogram()
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
data = loan50
-
Dit stukje code zegt dat het dataframe dat we gebruiken
loan50
heet. Voor je eigen grafiek zou jeloan50
vervangen door de naam van het data.frame dat je gebruikt. mapping = aes(x = interest_rate)
-
Dit deel van de code zegt dat
interest_rate
de variabele is die we willen weergeven. Voor je eigen grafiek zou je dusinterest_rate
vervangen door je eigen variabele. geom_histogram()
-
Dit vertelt ggplot2 dat we een histogram willen maken. Dit produceert een basis histogram met 30 bins (zie hieronder voor opties die deze standaardinstelling veranderen).
8.4.1 Histogram: bin-grootte regelen
Er zijn verschillende mogelijkheden om te bepalen hoe de gegevens van de variabele worden gegroepeerd: de breedte van de bins (‘bakken’), het aantal bins of handmatige breekpunten instellen:
8.4.1.1 Breedte van de bins
ggplot(data = loan50,
mapping = aes(x = interest_rate)) +
geom_histogram(binwidth = 2.5)
geom_histogram(binwidth = 2.5)
-
De optie binwidth stelt de breedte van de bins in, in dit voorbeeld op 2.5.
8.4.1.2 Aantal bins
ggplot(data = loan50,
mapping = aes(x = interest_rate)) +
geom_histogram(bins = 10)
geom_histogram(bins = 10)
-
De optie bins stelt het aantal bins in, in dit voorbeeld 10.
8.4.1.3 Handmatige breekpunten
ggplot(data = loan50,
mapping = aes(x = interest_rate)) +
geom_histogram(breaks=seq(5,27.5,by=2.5))
geom_histogram(breaks=seq(5,27.5,by=2.5)
-
De optie
breaks
stelt exacte breekpunten in voor de bins in de histogrammen. In dit voorbeeld stellen we breekpunten in van 5 tot 27.5 in stappen van 2.5 (d.w.z. de eerste bin is 5-7.5, de tweede 7.5-10, etc.).
8.4.2 Histogram: extra opties
data(loan50)
ggplot(data = loan50,
mapping = aes(x = interest_rate)) +
geom_histogram(breaks=seq(5,27.5,by=2.5), colour = "black", fill="grey") +
labs(title = "Histogram of interest rate",
x = "Interest Rate", y= "Count") +
theme_minimal()
geom_histogram(colour = "black", fill="grey")
-
Dit regelt het uiterlijk van de balken. In dit voorbeeld voegen we een zwarte rand toe aan de balk door de
colour
(kleur) in te stellen en defill
(vulkleur) te veranderen in grijs. labs(title = "Title", x = "x axis title", y = "y axis title")
-
Deze optie voegt mooiere namen toe voor de titel van de grafiek, en de titels van de x- en y-as.
theme_minimal()
-
Om het uiterlijk van een grafiek te veranderen, kun je de
theme_*
functies gebruiken (waarbij je in plaats van ster verschillende opties kunt toevoegen, zoalstheme_minimal()
,theme_classic()
oftheme_light()
.
8.5 Box plot
Een boxplot geeft een samenvatting van een variabele, met behulp van vijf statistieken, waaronder de mediaan, Q1 en Q3.
ggplot(data = loan50,
mapping = aes(x = interest_rate)) +
geom_boxplot()
data = loan50
-
Dit stukje code zegt dat het dataframe dat we gebruiken
loan50
heet. Voor je eigen grafiek zou jeloan50
vervangen door de naam van het dataframe dat je gebruikt. mapping = aes(x = interest_rate)
-
Dit deel van de code zegt dat
interest_rate
de variabele is die we willen weergeven. Voor je eigen grafiek zou je dusinterest_rate
vervangen door je eigen variabele. geom_boxplot()
-
Dit vertelt ggplot2 dat we een boxplot willen maken. Dit produceert een basis boxplot.
8.5.1 Box plot: extra opties
ggplot(data = loan50,
mapping = aes(y = interest_rate)) +
geom_boxplot(fill = "grey") +
labs(title = "Boxplot of interest rate",
y = "Interest rate") +
theme_minimal() +
theme(axis.text.x=element_blank(),axis.ticks.x=element_blank())
aes(y = interest_rate)
-
Als we interest_rate op de y-as zetten (in plaats van op de x-as) veranderen we de oriëntatie van de boxplot.
geom_boxplot(fill = "grey")
-
De optie
fill
bepaalt de kleur van de vakjes. Merk op dat de kleur tussen aanhalingstekens moet worden opgegeven (dus"grey"
). labs(title = "Title", x = "x axis title", y = "y axis title")
-
Deze optie voegt mooiere namen toe voor de titel van de grafiek, en de titels van de x- en y-as.
theme_minimal()
-
Om het uiterlijk van een grafiek te veranderen, kun je de
theme_*
functies gebruiken (waarbij je in plaats van ster verschillende opties kunt toevoegen, zoalstheme_minimal()
,theme_classic()
oftheme_light()
. theme(axis.text.x=element_blank(),axis.ticks.x=element_blank())
-
Deze optie zorgt dat op de x as geen labels and ticks weergegeven worden, aangezien deze betekenisloos zijn.
8.5.2 Box plot: meerdere groepen
ggplot(data = loan50,
mapping = aes(x = interest_rate, y = homeownership)) +
geom_boxplot()
aes(x = interest_rate, y = homeownership)
-
In dit voorbeeld geven we de rente (interest rate) weer per type woningbezit (eigen, hypotheek, huur). Hier plaatsen we
interest_rate
op de x-as enhomeownership
op de y-as. Merk op dat de tweede variabele (in dit gevalhomeownership
) eenfactor
ofcharacter
variabele moet zijn (d.w.z. categoriaal).
8.6 Staafdiagram (Bar plot)
Een staafdiagram kan worden gebruikt om tellingen of proporties van categoriale variabelen weer te geven. U kunt het ook gebruiken om samenvattende statistieken (bv. gemiddelden) voor verschillende groepen weer te geven.
Merk op dat een histogram wordt gebruikt voor de weergave van frequenties van numerieke (interval-ratio) variabelen, terwijl een staafdiagram wordt gebruikt voor de weergave van frequenties van categoriale variabelen.
ggplot(data = loan50,
mapping = aes(x = homeownership)) +
geom_bar()
data = loan50
-
Dit stukje code zegt dat het dataframe dat we gebruiken
loan50
heet. Voor je eigen grafiek zou jeloan50
vervangen door de naam van het dataframe dat je gebruikt. mapping = aes(x = homeownership)
-
Dit deel van de code zegt dat
homeownership
de variabele is die we willen laten zien. Voor je eigen grafiek, zou je dushomeownership
vervangen door je eigen variabele. geom_bar()
-
Dit vertelt ggplot2 dat we een barplot willen maken. Dit produceert een basis barplot.
8.6.1 Bar plot: extra opties
ggplot(data = loan50,
mapping = aes(x = homeownership)) +
geom_bar(fill = "grey", colour = "black") +
labs(title = "Homeownership",
x = "Home ownership type",
y = "Count") +
theme_minimal()
geom_bar(fill = "grey", colour = "black")
-
De optie
fill
bepaalt de kleur van de balken encolour
bepaalt de kleur van de rand. Merk op dat de kleur tussen aanhalingstekens moet worden opgegeven (dus"grey"
). labs(title = "Title", x = "x axis title", y = "y axis title")
-
Deze optie voegt mooiere namen toe voor de titel van de grafiek, en de titels van de x- en y-as. Opmerking: als je de manier waarop de categorieën worden gepresenteerd wilt veranderen (d.w.z. “Huur” in plaats van “huur”), moet je de variabele
homeownership
hercoderen. theme_minimal()
-
Om het uiterlijk van een grafiek te veranderen, kun je de
theme_*
functies gebruiken (waarbij je in plaats van ster verschillende opties kunt toevoegen, zoalstheme_minimal()
,theme_classic()
oftheme_light()
.
8.6.2 Bar plot: meerdere groepen
Wanneer je twee categoriale variabelen hebt, kun je een staafdiagram maken dat beide variabelen weergeeft. In het onderstaande geval geven we homeownership
en verified_income
weer.
8.6.2.1 Gestapelde staafdiagram (stacked bar plot)
ggplot(data = loan50,
mapping = aes(x = homeownership)) +
geom_bar(aes(fill = verified_income))
geom_bar(aes(fill = verified_income))
-
De optie
fill
(binnenaes
) geeft aan dat we elke staaf willen onderverdelen naar de categorieën vanverified_income
.
Note: als je de labels in de legenda van deze grafiek wilt veranderen, kun je het beste de variabele (verified_income
) hernoemen (rename
) en hercoderen (recode
). Dit behandelen we in de komende weken.
8.6.2.2 Staven naast elkaar
ggplot(data = loan50,
mapping = aes(x = homeownership)) +
geom_bar(aes(fill = verified_income), position="dodge")
geom_bar(aes(fill = verified_income), position = "dodge")
-
De optie
fill
(binnenaes
) geeft aan dat we elke staaf willen onderverdelen naar de categorieën vanverified_income
. We voegenposition = "dodge"
toe om de staven naast elkaar weer te geven in plaats van te stapelen.
8.6.2.3 Percentage gestapeld staafdiagram
Dit type staafdiagram stapelt de subcategorieën, maar berekent ze als een percentage.
ggplot(data = loan50,
mapping = aes(x = homeownership)) +
geom_bar(aes(fill = verified_income), position = "fill") +
scale_y_continuous(labels = label_percent()) +
labs(y = "Percentage")
geom_bar(aes(fill = verified_income), position = "fill")
-
De optie
fill
(binnenaes
) geeft aan dat we elke staaf willen onderverdelen naar de categorieën vanverified_income
. scale_y_continuous(labels = label_percent())
-
Dit zorgt ervoor dat percentages in plaats van aantallen op de y-as worden weergegeven. De functie
label_percent()
komt uit packagescales
. labs(y = "Percentage")
-
Om ervoor te zorgen dat op de y-as “Percentage” staat in plaats van “Counts”, wijzigen we het label van de y-as.
8.6.3 Staafdiagram van gemiddelden
We kunnen ook staafdiagrammen gebruiken om statistieken weer te geven (bijvoorbeeld gemiddelden) van een numerieke variabele voor elke categorie van een categorische variabele. Laten we bijvoorbeeld de gemiddelde interest_rate
per type homeownership
plotten.
Eerst moeten we een dataframe maken dat de gemiddelde rente per type huiseigendom laat zien. Dit kunnen we doen met group_by
en summarise
uit het dplyr
pakket. We zullen deze functies later in de cursus in meer detail bespreken. Voor nu is het voldoende om te begrijpen dat we de gemiddelde rente voor elk type huizenbezit berekenen:
<- loan50 |>
loan50_means group_by(homeownership) |>
summarise(interest_rate = mean(interest_rate, na.rm=TRUE))
loan50_means
# A tibble: 3 × 2
homeownership interest_rate
<fct> <dbl>
1 rent 10.8
2 mortgage 11.9
3 own 13.9
Met dit nieuwe dataframe loan50_means
, kunnen we een staafdiagram maken van deze gemiddelden, met geom_col()
:
ggplot(data = loan50_means,
mapping = aes(x = homeownership, y = interest_rate)) +
geom_col()
data = loan50_means
-
Merk op dat we hier de dataset
loan50_means
gebruiken, die we hierboven hebben gemaakt. Deze bevat de gemiddeldeinterest_rate
per typehomeownership
. mapping = aes(x = homeownership, y = interest_rate)
-
Dit deel van de code geeft de categoriale (x) variabele en de numerieke (y) variabele.
geom_col()
-
Dit vertelt ggplot2 dat we een staafdiagram willen maken waar we de waarden van de gegevens willen weergeven (niet de tellingen per groep, zoals met
geom_bar
).