Inleiding

Met mapplots kun je cirkel- en staafdiagrammen aan het kaartbeeld toevoegen in R. Deze package is ontwikkeld / wordt onderhouden door Hans Gerritsen, maritiem zoöloog aan het Marine Institute van Ierland. In de documentatie over mapplots staat dan ook dat de bibliotheek is ontwikkeld voor de weergave van gegevens over de visserij, maar de meeste functies kunnen ook worden gebruikt voor meer generieke datavisualisatie.

In de voorbeelden op deze pagina gebruiken we de functie draw.pie() om de bevolkingsopbouw per gemeente te visualiseren in een cirkeldiagram.

Het volledige script waarmee de afbeeldingen voor Flevoland en Drenthe zijn gemaakt, staat hier: Cirkeldiagrammen_op_de_kaart.R.

Jonge bevolking

In de afbeelding hierboven valt duidelijk op dat Flevoland een relatief jonge bevolking heeft, met een groot aandeel jongeren en weinig ouderen. Dit is waarschijnlijk te verklaren door het feit dat deze provincie pas in de twintigste eeuw is ‘aangewonnen’. (Voor een vergelijking met een provincie op het oude land - met relatief oudere bevolking: zie afbeelding voor Drenthe onder aan deze pagina.)

Door de omvang van de cirkels (Almere heeft 196.000 inwoners) is ook goed te zien dat de bevolking zich - anders dan de planners hadden beoogd - in het zuidwesten heeft geconcentreerd, namelijk zo dicht als mogelijk bij bevolkings- en werkgelegenheidsconcentraties op het oude land.

Voorbereiding

Benodigde bibliotheken

Voor het naspelen van de hier gegeven voorbeelden moeten de volgende bibliotheken geladen worden:

library(rgdal) # rgdal zal ook een andere benodigde bibliotheek laden: sp 
library(tidyr)
library(rgeos)
library(mapplots)

Gebruikte data

Als invoer gebruiken we de tabel NL_Gemeenten2014, die ook in andere blogs op deze site als voorbeeld wordt gebruikt.

gem2014 <- readOGR(dsn = "Data", layer = "NL_Gemeenten2014")

Voor meer informatie over het downloaden, uitpakken en inlezen van deze tabel met behulp van R: zie de blog readOGR(): het inlezen van geografische data in R.

In de metadata van de tabel NL_Gemeenten2014.TAB zien we dat er een aantal kolommen zijn met aantallen inwoners per leeftijdscategorie, namelijk de kolommen inw_jonger_dan_5j tot en met inw_80j_en_ouder. Om de cirkeldigrammen overzichtelijk en leesbaar te houden, gaan we deze leeftijdsgegevens samenvoegen tot drie brede categorieën: jongeren (0-24 jaar), beroepsbevolking (25-64 jaar) en ouderen (65 jaar en ouder). Dit doen we met behulp van de volgende statements:

gem2014@data$jongeren <- gem2014@data$inw_jonger_dan_5j + gem2014@data$inw_5_9j + gem2014@data$inw_10_14j + gem2014@data$inw_15_19j + gem2014@data$inw_20_24j
gem2014@data$beroepsbevolking <- gem2014@data$inw_25_44j + gem2014@data$inw_45_64j
gem2014@data$ouderen <- gem2014@data$inw_65_79j + gem2014@data$inw_80j_en_ouder

Aangezien de tabel bij het inlezen 34 kolommen met attribuutgegevens had, worden de nieuwe kolommen jongeren, beroepsbevolking en ouderen toegevoegd als respectievelijk kolom 35, 36 en 37.

Voorbereiden invoergegevens voor de plot

We selecteren eerst een provincie, bijvoorbeeld Flevoland:

flevoland <- gem2014[gem2014@data$Provincie_naam == "Flevoland",]

Voor het correct plaatsen van de cirkeldiagrammen vragen we de coördinaten van de de centroïden van de gemeenten op:

centroiden.flevoland <- gCentroid(flevoland, byid = TRUE, id = flevoland@data$Gemeentenaam)
centroiden.flevoland

Ook stellen we een tabelletje samen met behulp van de functie gather(), met voor elke gemeente per categorie het aantal inwoners:

bevsam.flevoland <- gather(as.data.frame(gem2014[gem2014@data$Provincie_naam == "Flevoland", c(2, 35:37)]), key = categorie, value = aantal, jongeren, beroepsbevolking, ouderen, -Gemeentenaam)
bevsam.flevoland

Vervolgens combineren we de centroïden en de bevolkingssamenstelling in één data frame:

invoer.flevoland <- as.data.frame(c(centroiden.flevoland,bevsam.flevoland))
invoer.flevoland

De data frame invoer.flevoland gebruiken we vervolgens als input voor het aanmaken van wat in de bibliotheek mapplots een xyz object wordt genoemd:

xyz.flevoland <- make.xyz(invoer.flevoland$x, invoer.flevoland$y, invoer.flevoland$aantal, invoer.flevoland$categorie)

Aanmaken plot

Na wat gepuzzel - met de kleurstelling, de marges, de grootte van de cirkels en de grootte en de positie van de legendaelementen - zijn wij tot de volgende plot gekomen:

par(mar = c(1, 1, 2, 1) + 0.1, mgp = c(5, 1, 0))
plot(flevoland, col = "lightgray", border = "white", main = paste("Bevolkingssamenstelling per gemeente","\nProvincie Flevoland, 1 januari 2014"))
kleuren <- c("darkolivegreen4","firebrick3","lightgoldenrod1")
radius.waarde <- 10000
draw.pie(xyz.flevoland$x,xyz.flevoland$y, xyz.flevoland$z, radius.waarde, border = "gray", col = kleuren)
usr <- par( "usr" )
text(usr[1]+11000, usr[4] - 3000, "Aantal inwoners * 1000", cex = .7)
legend.bubble(usr[1]+11000, usr[4] - 16000, z=max(rowSums(xyz.flevoland$z))/1000, maxradius = radius.waarde, inset=0.02, txt.cex=0.7, pch=21, col="darkgrey", bty = "n")
legend.pie(usr[1]+11000, usr[4] - 34000,labels=c("jongeren", "beroepsbevolking", "ouderen"), radius = radius.waarde/2, bty = "n", cex = .7, label.dist = 1.2, col = kleuren, border = "gray")

De afbeelding voor Flevoland staat boveaan deze pagina. Hieronder staat het resultaat van een vergelijkbare exercitie voor de provincie Drenthe:




Meer weten over geografische analyses met R?

Zie het open source e-book 'Geografische analyses met R'


Egge-Jan Pollé