Cursus
Histogrammen laten in één oogopslag de vorm van de verdeling van een dataset zien. In deze tutorial laat ik je stap voor stap zien hoe je histogrammen maakt en aanpast met ggplot2, R’s meest gebruikte visualisatiebibliotheek en een kernonderdeel van het tidyverse-ecosysteem. ggplot2 volgt een grammar of graphics waarmee je complexe visualisaties opbouwt door laagelementen te stapelen. Voor een base R-aanpak, zie onze histogram-tutorial met base R.
TL;DR
-
Gebruik
geom_histogram()binnen eenggplot()-aanroep om een histogram te tekenen -
Stuur het aantal bins aan met
binsof de bin-grootte metbinwidthbinnengeom_histogram() -
Pas balkkleuren aan met de argumenten
color(omtrek) enfill(vulling) -
Leg een dichtheidskromme erbovenop met
geom_density()nadat jey = after_stat(density)hebt ingesteld -
Splits op categorie met
fill = variableinaes()of gebruikfacet_grid()voor afzonderlijke panelen
Wat is een histogram?
Histogrammen zijn visualisaties die frequentieverdelingen over continue (numerieke) variabelen tonen. Zo zie je hoeveel waarnemingen binnen de bereiken vallen die de continue variabele beslaat.
Aan de slag met ggplot2
Om deze tutorial te volgen heb je R nodig en de volgende packages: ggplot2, readr en dplyr. De code in de volgende sectie installeert ze als je dat nog niet hebt gedaan.
Packages installeren
We moeten eerst de ggplot2-bibliotheek importeren met de functie library. Hiermee krijg je toegang tot alle ingebouwde functies van ggplot2. Als je ggplot2 nog niet hebt geïnstalleerd, doe dat dan met install.packages(). Hetzelfde doen we voor de readr-bibliotheek, om een CSV-bestand in te lezen, en dplyr, waarmee we makkelijker met de ingelezen data kunnen werken.
install.packages("ggplot2")
install.packages("readr")
install.packages("dplyr")
library(ggplot2)
library(readr)
library(dplyr)
De dataset laden
Voor deze tutorial gebruiken we deze woningendataset, met details over verschillende woningaanbiedingen, waaronder de grootte van het huis, het aantal kamers, de prijs en locatie-informatie.
We kunnen de data inlezen met de functie read_csv(). Dat kan rechtstreeks vanaf de URL, of je downloadt het CSV-bestand en leest het lokaal in. Het eerste attribuut van read_csv() is de locatie van de data, en met het attribuut col_select kies je de kolommen die ons interesseren.
home_data <- read_csv(
"https://raw.githubusercontent.com/rashida048/Datasets/master/home_data.csv",
col_select = c(price, condition)
)
Daarna kunnen we met de functie head() de eerste paar rijen bekijken:
head(home_data)

Hoe maak je een histogram met ggplot2
Nu kunnen we het histogram maken. Ongeacht het type grafiek dat we in ggplot2 maken, we beginnen altijd met de functie ggplot(), die een canvas maakt om laagelementen aan toe te voegen. Deze functie neemt twee parameters.
-
Het eerste argument is een data frame. Hier willen we
home_datagebruiken. -
Het tweede argument is een mapping van kolommen in het data frame naar plotesthetiek. Deze mapping moet de functie
aes()aanroepen. Hier mappen we de kolom price op de x-as.
Tot nu toe is onze code
ggplot(data = home_data, aes(x = price))
Dit tekent op zichzelf niets bruikbaars. Om er een histogram van te maken voegen we de histogram-geometrie toe met geom_histogram().
ggplot(data = home_data, aes(x = price)) +
geom_histogram()

Voeg beschrijvende statistieken toe aan een histogram met geom_vline()
We kunnen beschrijvende statistieken aan onze plot toevoegen met de functie geom_vline(). Dit voegt een verticale lijn-geometrie toe aan de plot.
Eerst berekenen we een beschrijvende statistiek, in dit geval de gemiddelde prijs, met dplyr’s summarize().
price_stats <- home_data |>
summarize(mean_price = mean(price))
price_stats
# A tibble: 1 × 1
mean_price
<dbl>
1 540088.
De functie neemt de parameter xintercept, en optionele color- en linewidth-attributen om respectievelijk de kleur en de dikte van de lijnen aan te passen. We voegen een gemiddelde-lijn toe met het plusteken, zoals in de vorige sectie.
ggplot(home_data, aes(x = price)) +
geom_histogram() +
geom_vline(aes(xintercept = mean_price), price_stats, color = "red", linewidth = 2)
Let op dat in geom_-functies de mapping- en data-argumenten omgewisseld zijn vergeleken met ggplot().

Waarschijnlijkheidsdichtheden plotten in plaats van tellingen
Om een dichtheidslijn aan het histogram toe te voegen, schalen we eerst de y-as naar dichtheid. In de functie aes() zetten we y op after_stat(density).
Vervolgens kunnen we een density-laag toevoegen met de functie geom_density(). Hier stellen we het attribuut color in op groen en linewidth op 2.
ggplot(home_data, aes(x = price, y = after_stat(density))) +
geom_histogram() +
geom_vline(aes(xintercept = mean_price), price_stats, color = "red", linewidth = 2) +
geom_density(color = "green", linewidth = 2)

Let op dat de getallen op de y-as zijn veranderd.
Merk ook op dat elke laag hetzelfde patroon volgt: een +-teken, een functieaanroep en optionele argumenten. Je kunt geom_-functies, statistieken en thema’s toevoegen zonder voor elke combinatie de syntax opnieuw te leren.
Update van binning met bins
We kunnen de binning van ons ggplot2-histogram aanpassen met het attribuut bins. We zetten dit gelijk aan het aantal bins dat we in de grafiek willen tonen. Dit helpt om grovere of juist fijnere details in ons histogram te zien.
ggplot(data = home_data, aes(x = price)) +
geom_histogram(bins = 100)

We kunnen de binbreedte ook handmatig instellen met het attribuut binwidth van geom_histogram().
ggplot(data = home_data, aes(x = price)) +
geom_histogram(binwidth = 50000)

Tot slot kun je de grenzen uitlijnen met de attributen center of boundary. Als je wilt dat de grenzen van bins op specifieke veelvouden vallen, kun je deze attributen gebruiken (er kan maar één tegelijk worden gebruikt). Om ervoor te zorgen dat bins op gehele waarden eindigen, zet je het attribuut gelijk aan 1.
ggplot(data = home_data, aes(x = price)) +
geom_histogram(boundary = 1)

De kleur van het histogram aanpassen
In deze sectie veranderen we de kleuren van het histogram. We kunnen de kleur van de omtrek van elke balk aanpassen met het attribuut color, en de vulling van de balken met het attribuut fill van geom_histogram(). We vullen de balken met blauw en zetten de omlijningskleur op wit.
ggplot(data = home_data, aes(x = price)) +
geom_histogram(color = "white", fill = "blue")

De kleur van het ggplot2-histogram op basis van groepen aanpassen
Je kunt de kleuren van de histogram-balken aanpassen.
Het veranderen van de fill-esthetiek (binnen de functie aes()) verandert de binnenkleuren van de balken op basis van de waarde van een variabele in de dataset. Die variabele moet categorisch zijn (een factor) in plaats van gehele getallen, dus we kunnen die converteren met de functie factor(). In dit voorbeeld bekijken we de variabele condition, een waarde van 1 (slechte staat) tot 5 (uitstekende staat).
home_data <- home_data |>
mutate(condition = factor(condition))
ggplot(data = home_data, aes(x = price, fill = condition)) +
geom_histogram()

Labels en titels toevoegen met labs()
Vervolgens voegen we titels en labels toe aan onze grafiek met de functie labs(). We zetten de attributen x, y en title op onze gewenste labels.
ggplot(data = home_data, aes(x = price)) +
geom_histogram() +
labs(x ='Prijs (USD)', y='Aantal aanbiedingen', title = 'Verdelingen van woningprijzen')

x-as-limieten instellen met xlim()
We kunnen de limieten van de x-as instellen met de functie xlim() om in te zoomen op de data die ons interesseren. Soms is het bijvoorbeeld handig om te focussen op het centrale deel van de verdeling in plaats van op de lange staart die we nu zien als we de hele plot bekijken.
De limieten van de y-as aanpassen kan ook (met ylim()), maar dat is bij histogrammen minder nuttig omdat de automatisch berekende waarden bijna altijd ideaal zijn.
We zoomen in op prijzen tussen $0 en $2M.
ggplot(home_data, aes(x = price)) +
geom_histogram(bins = 100) +
xlim(0, 2000000)

Positie van de legenda wijzigen
Als we de legenda in onze grafiek willen verplaatsen, bijvoorbeeld wanneer we de conditie in verschillende kleuren visualiseren, kunnen we de functie theme() en het attribuut legend.position gebruiken. Toegestane waarden voor legend.position zijn “bottom”, “top”, “left” of “right”. Je kunt ook coördinaten doorgeven met c(x, y) voor een specifieke positie.
ggplot(home_data, aes(x = price, fill = condition)) +
geom_histogram() +
theme(legend.position = "bottom")
Facetten gebruiken in ggplot2
Tot slot kunnen we data per groep in afzonderlijke grafieken visualiseren met facetten. Dit splitst de visualisatie in meerdere subplotten, één per categorie. Dit doe je met de functie facet_grid(). Hieronder visualiseren we de prijsverdelingen per conditiewaarde.
ggplot(home_data, aes(x = price)) +
geom_histogram() + facet_grid(vars(condition))
Facetteren wordt uitgebreider behandeld in de tutorial Facets for ggplot in R.

Tot slot
Om een histogram in ggplot2 te maken, bouw je de basis met ggplot(), geef je je data frame en aes()-mapping door, en voeg je geom_histogram() toe. Vanaf daar kun je laag voor laag aanpassen: labs() voor as-titels, xlim() om de x-as in te zoomen, en theme() om de legenda te verplaatsen of de stijl te wijzigen.
ggplot2 komt uitgebreid aan bod in het skill track Data Visualization in R, te beginnen met Introduction to Data Visualization with ggplot2. Je leert ggplot2 combineren met andere tidyverse-tools in het skill track Tidyverse Fundamentals with R.
Voor meer ggplot2-plottypes naast histogrammen, zie onze Graphics with ggplot2-tutorial, en download een kopie van de ggplot2-cheat sheet als handig naslagwerk.
Data Science-schrijver | Senior Technical Marketing Analyst bij Wayfair | MSE in Data Science aan de University of Pennsylvania
