draw.pie()
: themakaart met cirkeldiagrammen in RMet 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.
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.
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)
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é