Ga naar hoofdinhoud

Facetten voor ggplot2 in R

In deze tutorial leer je alles uit de facetfuncties van ggplot te halen.
Bijgewerkt 2 okt 2026  · 8 min lezen

Verken met AI

ChatGPTClaudePerplexity

Introductie

Met facetten kun je grafieken met meerdere panelen maken en bepalen hoe de schalen van het ene paneel zich verhouden tot die van een ander.

Eenvoudig gebruik van facetten

Als je ook maar een beetje bekend bent met ggplot2, ken je de basisstructuur van een aanroep van de functie ggplot(). Voor een introductie tot ggplot2 kun je onze  ggplot2-cursus bekijken. Wanneer je ggplot aanroept, geef je een databron op, meestal een data frame, en vraag je ggplot om verschillende variabelen uit je data te koppelen aan verschillende esthetieken, zoals de positie van de x- of y-as of de kleur van je punten of balken. Met facetten krijg je een extra manier om variabelen te mappen. Om dit te laten zien, gebruik je de volgende dataset, met een aantal economische indicatoren voor een selectie landen. De meeste daarvan zijn varianten op het bbp, het bruto binnenlands product van elk land.

 print(econdata)
##   Country  GDP_nom  GDP_PPP GDP_nom_per_capita GDP_PPP_per_capita
## 1     USA 19390600 19390600              59501              59495
## 2  Canada  1652412  1769270              45077              48141
## 3   China 12014610 23159107               8643              16807
## 4   Japan  4872135  5428813              38440              42659
## 5  France  2583560  2835746              39869              43550
## 6 Germany  3684816  4170790              44550              50206
## 7  Sweden  3684816   520937              53218              51264
## 8 Ireland   333994   343682              70638              72632
##   GNI_per_capita        Region
## 1          58270 North America
## 2          42870 North America
## 3           8690          Asia
## 4          38550          Asia
## 5          37970        Europe
## 6          43490        Europe
## 7          52590        Europe
## 8          55290        Europe

De volgende variabelen zijn aanwezig:

Country: Spreekt voor zich!

GDP_nom: Bruto binnenlands product als nominale waarde in USD

GDP_PPP: Bruto binnenlands product gecorrigeerd voor verschillende koopkracht

GDP_nom_per_capita: Bruto binnenlands product als nominale waarde in USD per hoofd van de bevolking

GDP_PPP_per_capita: Bruto binnenlands product gecorrigeerd voor verschillende koopkracht per hoofd van de bevolking

GNI_per_capita: Bruto nationaal inkomen per land per hoofd van de bevolking.

Region: regio van de wereld waar het land zich bevindt.

Om te beginnen maken we een eenvoudige staafdiagram van het nominale bbp van elk land.

ggplot(econdata, aes(x=Country, y=GDP_nom))+
  geom_bar(stat='identity', fill="forest green")+
  ylab("GDP (nominal)")
plot

Je kunt ook een andere variabele plotten, het voor koopkracht (PPP) aangepaste bbp.

ggplot(econdata, aes(x=Country, y=GDP_PPP))+
  geom_bar(stat='identity', fill="forest green")+
  ylab("GDP (PPP)")
plot

Dit levert een tweede aparte grafiek op, vergelijkbaar met de vorige maar met een andere variabele. Stel dat je zowel het bbp (nominaal) als het bbp (PPP) samen wilt plotten. Hiervoor gebruik je facetten. Eerst moet je je data herstructureren, van een "brede" vorm met elke variabele in een eigen kolom naar een "lange" vorm, waarbij je één kolom gebruikt voor de metingen en een andere voor een sleutelvariabele die aangeeft welke meting we in elke rij gebruiken.

econdatalong <- gather(econdata, key="measure", value="value", c("GDP_nom", "GDP_PPP"))

Als je de data eenmaal in dit formaat hebt, kun je de sleutelvariabele gebruiken om met facetten te plotten. Laten we een eenvoudige grafiek bouwen, met zowel het nominale bbp (uit onze eerste grafiek) als het bbp (PPP) (uit onze tweede grafiek). Hiervoor pas je simpelweg je code aan door +facet_wrap() toe te voegen en op te geven dat ~measure, onze sleutelvariabele, gebruikt moet worden voor facetteren.

ggplot(econdatalong, aes(x=Country, y=value))+
  geom_bar(stat='identity', fill="forest green")+
  facet_wrap(~measure)
plot

Dit werkt, maar je ziet dat de landenamen erg samengeperst zijn. Laten we onze panelen herindelen.

Lay-out aanpassen en volgorde wijzigen

Het commando facet_wrap() kiest automatisch hoeveel kolommen er worden gebruikt. Je kunt dit direct opgeven met ncol=, zoals hieronder:

ggplot(econdatalong, aes(x=Country, y=value))+
  geom_bar(stat='identity', fill="forest green")+
  facet_wrap(~measure,  ncol=1)
plot

Je ziet waarschijnlijk dat de landen op de x-as hierboven alfabetisch zijn gerangschikt. Als je dit wilt veranderen, is de eenvoudigste manier om de levels van de factor Country in te stellen. Laten we deze herordening uitvoeren en de landen rangschikken op volgorde van totaal nominaal bbp.

econdata$Country <- factor(econdata$Country, levels= econdata$Country[order(econdata$GDP_nom)])


econdatalong <- gather(econdata, key="measure", value="value", c("GDP_nom", "GDP_PPP"))


ggplot(econdatalong, aes(x=Country, y=value))+
  geom_bar(stat='identity', fill="forest green")+
  facet_wrap(~measure,  ncol=1)
plot

Je kunt ook extra aanpassingen doen, zoals de facetlabels naar de linkerkant verplaatsen met het argument strip.position.

ggplot(econdatalong, aes(x=Country, y=value))+
  geom_bar(stat='identity', fill="forest green")+
  facet_wrap(~measure,  ncol=1, strip.position = "left")
plot

Facetten labelen

Je hebt misschien gemerkt dat de facetten eenvoudige korte kopjes hebben, afkomstig van de levels van de factor measure. Laten we dit netjes maken en onze facetten mooiere labels geven. Hiervoor maak je een eenvoudige labeller-functie, variable_labeller, die de juiste naam teruggeeft wanneer er om een van de waarden van variable_names wordt gevraagd. Vervolgens geef je deze functie door aan het argument labeller van facet_wrap.

variable_names <- list(
  "GDP_nom" = "GDP (nominal)" ,
  "GDP_PPP" = "GDP (purchasing power parity)"
)


variable_labeller <- function(variable,value){
  return(variable_names[value])
}


ggplot(econdatalong, aes(x=Country, y=value))+
  geom_bar(stat='identity', fill="forest green")+
  facet_wrap(~measure,  ncol=1, labeller=variable_labeller)
plot

Spelen met schalen en ruimte

Laten we een grotere gefacetteerde grafiek maken, met elk van de economische maten.

econdatalong <- gather(econdata, key="measure", value="value", c( "GDP_nom" , "GDP_PPP" ,"GDP_nom_per_capita", "GDP_PPP_per_capita" ,"GNI_per_capita"))

variable_names <- list(
  "GDP_nom" = "GDP (nominal)" ,
  "GDP_PPP" = "GDP (purchasing power parity)",
  "GDP_nom_per_capita" = "GDP (nominal) per capita",
  "GDP_PPP_per_capita" = "GDP (purchasing power parity) per capita",
  "GNI_per_capita"  = "GNI per capita"
)


variable_labeller <- function(variable,value){
  return(variable_names[value])
}



ggplot(econdatalong, aes(x=Country, y=value))+
  geom_bar(stat='identity', fill="forest green")+
  facet_wrap(~measure,  ncol=1, labeller= variable_labeller)+
scale_y_continuous(breaks = pretty(econdatalong$value, n = 10))
plot

Dat schiet zo niet op! Je kunt de waarden voor drie van de panelen niet zien. Hoe komt dat? Laten we naar de brondata kijken om te zien waarom.

summary(econdata)
##     Country     GDP_nom            GDP_PPP         GDP_nom_per_capita
##  Ireland:1   Min.   :  333994   Min.   :  343682   Min.   : 8643     
##  Canada :1   1st Qu.: 2350773   1st Qu.: 1457187   1st Qu.:39512     
##  France :1   Median : 3684816   Median : 3503268   Median :44814     
##  Germany:1   Mean   : 6027118   Mean   : 7202368   Mean   :44992     
##  Sweden :1   3rd Qu.: 6657754   3rd Qu.: 8919260   3rd Qu.:54789     
##  Japan  :1   Max.   :19390600   Max.   :23159107   Max.   :70638     
##  (Other):2                                                           
##  GDP_PPP_per_capita GNI_per_capita            Region
##  Min.   :16807      Min.   : 8690   Asia         :2  
##  1st Qu.:43327      1st Qu.:38405   Europe       :4  
##  Median :49174      Median :43180   North America:2  
##  Mean   :48094      Mean   :42215                    
##  3rd Qu.:53322      3rd Qu.:53265                    
##  Max.   :72632      Max.   :58270                    
##

Als je naar elke kolom kijkt, zie je dat de waarden per kolom over enkele ordes van grootte variëren. Standaard gebruiken facetten dezelfde limieten en bereiken voor zowel de X- als Y-as. Om dit te wijzigen, kun je dit stukje toevoegen aan je facetcode: scales="free_y" zodat elke facet een eigen onafhankelijke schaal gebruikt.

ggplot(econdatalong, aes(x=Country, y=value))+
  geom_bar(stat='identity', fill="forest green")+
  facet_wrap(~measure, scales="free_y", ncol=1,  labeller= variable_labeller)
plot

Dit is een stuk beter. Elke facet heeft nu een eigen onafhankelijke y-as.

Facetten gebruiken om onderverdelingen te maken

Je hebt misschien gezien dat onze dataset ook de variabele Region bevat, die aangeeft in welke regio het betreffende land ligt. Je kunt deze variabele gebruiken om onze balken per regio in te kleuren, als volgt:

ggplot(econdatalong, aes(x=Country, y=value, fill=Region))+
  geom_bar(stat='identity')+
  facet_wrap(~measure, scales="free_y", ncol=1, labeller= variable_labeller)
plot

Dit is echter wat rommelig; zou het niet fijn zijn als je elke regio in een eigen subpaneel kon zetten? Met facetten kan dat! Hier ga je facet_grid gebruiken in plaats van facet_wrap, omdat je daarmee facetten eenvoudig aan twee variabelen kunt koppelen, Region en measure, waarbij deze twee variabelen over de rijen en kolommen van een raster met grafieken worden verdeeld. Let op dat je ook scales="free" en space="free" instelt, zodat de verschillende panelen verschillende hoeveelheden ruimte kunnen innemen. Je moet ook een nieuwe labeller-functie maken die namen voor zowel rijen als kolommen oplevert.

variable_names <- list(
  "GDP_nom" = "GDP \n(nominal)" ,
  "GDP_PPP" = "GDP \n(PPP)",
  "GDP_nom_per_capita" = "GDP (nominal)\n per capita",
  "GDP_PPP_per_capita" = "GDP (PPP)\n per capita",
  "GNI_per_capita"  = "GNI \nper capita"
)



region_names <- levels(econdata$Region)


variable_labeller2 <- function(variable,value){
  if (variable=='measure') {
  return(variable_names[value])
  } else {
    return(region_names)
  }
}

ggplot(econdatalong, aes(x=Country, y=value, fill=Region))+
  geom_bar(stat='identity')+
  facet_grid(measure~Region, scales="free", space="free_x",  labeller= variable_labeller2)
plot

Nu is het veel duidelijker! Elke regio heeft zijn eigen kolom met panelen, en elke metriek heeft zijn eigen rij met balken.

Dat was het wel zo'n beetje voor deze tutorial. Hopelijk vond je het leuk om meer te leren over facetten.

Wil je meer leren over facetten? Volg dan DataCamp’s cursus Visualizing Big Data with Trelliscope.

Bekijk ook onze Aan de slag met de Tidyverse: tutorial.

Onderwerpen
R
Data Science

R-cursussen

Cursus

Introductie tot R

4 uur
3.1M
Beheers de basis van data-analyse in R, inclusief vectors, lists en data frames, en oefen met echte datasets.
Bekijk detailsRight Arrow
Start Cursus
Meer bekijkenRight Arrow
Gerelateerd

blog

AI vanaf nul leren in 2026: een complete gids van de experts

Ontdek alles wat je moet weten om in 2026 AI te leren, van tips om te beginnen tot handige resources en inzichten van industrie-experts.
Adel Nehme's photo

Adel Nehme

15 min

Meer BekijkenMeer Bekijken