Cursus
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)")

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)")

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)

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)

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)

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")

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)

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))

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)

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)

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)

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.
