Cartografie

Icoon vorm van Nederland

Veel datasets bevatten regionale cijfers. In deze handleiding wordt aan de hand van een voorbeeld over geboortecijfers uitgelegd hoe CBS-data gekoppeld kan worden aan geografische gegevens om een thematische kaart te maken met R of Python. De informatie uit de Snelstartgids wordt bekend verondersteld.

Het CBS publiceert haar geografische kaarten via PDOK (Publieke Dienstverlening Op de Kaart). De dataset "CBS Gebiedsindelingen" bevat de meest gebruikte gebiedsindelingen die het CBS hanteert. Deze geodata is te downloaden in verschillende bestandsformaten zoals Shapefile en GeoJSON, maar het is ook mogelijk om de bestanden geautomatiseerd op te halen met de API. In deze handleiding wordt gebruik gemaakt van de API zodat altijd de meest recente correcties in de kaarten doorgevoerd zijn. Meer informatie over de geo-API is te vinden in de documentatie. Let op: gebiedsindelingen veranderen regelmatig. Kies de juiste geografische informatie bij de data.

De codevoorbeelden kunnen eenvoudig naar het klembord worden gekopieerd door op de knop in het codeblok te klikken. De voorbeelden op deze pagina zijn ook gebundeld te vinden op GitHub.

Keuzemenu programmeertaal:

Voor het werken met geodata wordt in deze handleiding gebruik gemaakt van sf. Om verschillende bewerkingen eenvoudiger te maken wordt tidyverse gebruikt, een verzameling van meerdere packages voor het verwerken van data.

De naam van de kolom met geboortecijfers kan opgezocht worden in de metadata van de kerncijfers wijken en buurten.

library(cbsodataR)
library(tidyverse)
library(sf)

# Zoek op welke data beschikbaar is
metadata <- cbs_get_meta("83765NED")
print(metadata$DataProperties$Key)

De tabel bevat 147 kolommen en de geboortecijfers zijn te vinden in de kolommen GeboorteTotaal_24 en GeboorteRelatief_25. Het is gebruikelijk om in thematische kaarten alleen relatieve aantallen weer te geven zodat regio's van verschillende groottes alsnog vergeleken kunnen worden. De gewenste data kan worden opgevraagd met cbs_get_data, waarbij de gewenste kolommen in de parameter select worden ingevuld.

data <- cbs_get_data("83765NED", 
    select=c("WijkenEnBuurten","GeboorteRelatief_25")) %>%
  mutate(WijkenEnBuurten = str_trim(WijkenEnBuurten),
         geboorte = GeboorteRelatief_25)

De geodata wordt via de API van het Nationaal Georegister van PDOK ingelezen met st_read uit sf.

# Haal de kaart met gemeentegrenzen op van PDOK
gemeentegrenzen <- st_read("https://service.pdok.nl/cbs/gebiedsindelingen/2017/wfs/v1_0?request=GetFeature&service=WFS&version=2.0.0&typeName=gemeente_gegeneraliseerd&outputFormat=json")

De geboortedata kan nu gekoppeld worden aan de gemeentegrenzen met een left_join.

# Koppel CBS-data aan geodata met regiocodes
data <- 
  gemeentegrenzen %>%
  left_join(data, by=c(statcode="WijkenEnBuurten"))

Vervolgens kan de thematische kaart gemaakt worden met het package ggplot2 uit tidyverse.

# Maak een thematische kaart
data %>%
  ggplot() +
  geom_sf(aes(fill = geboorte)) +
  scale_fill_viridis_c() +
  labs(title = "Levend geborenen per 1000 inwoners, 2017", fill = "") +
  theme_void()

Thematische kaart van geboortecijfers in Nederland.

Om de CBS-data op te halen kan het package cbsodata worden gebruikt. Voor het werken met geodata wordt in deze handleiding gebruik gemaakt van geopandas. De naam van de kolom met geboortecijfers kan opgezocht worden in de metadata van de kerncijfers wijken en buurten.

import pandas as pd
import geopandas as gpd
import cbsodata

# Zoek op welke data beschikbaar is
metadata = pd.DataFrame(cbsodata.get_meta('83765NED', 'DataProperties'))

De tabel bevat 147 kolommen en de geboortecijfers zijn te vinden in de kolommen GeboorteTotaal_24 en GeboorteRelatief_25. Het is gebruikelijk om in thematische kaarten alleen relatieve aantallen weer te geven zodat regio's van verschillende groottes alsnog vergeleken kunnen worden. De gewenste data kan worden opgevraagd met get_data.

# Download geboortecijfers en verwijder spaties uit regiocodes
data = pd.DataFrame(cbsodata.get_data('83765NED', select = ['WijkenEnBuurten', 'Codering_3', 'GeboorteRelatief_25']))
data['Codering_3'] = data['Codering_3'].str.strip()

De geodata wordt via de API van het Nationaal Georegister van PDOK gedownload en vervolgens ingelezen met read_file uit geopandas.

# Haal de kaart met gemeentegrenzen op van PDOK
geodata_url = 'https://service.pdok.nl/cbs/gebiedsindelingen/2017/wfs/v1_0?request=GetFeature&service=WFS&version=2.0.0&typeName=gemeente_gegeneraliseerd&outputFormat=json'
gemeentegrenzen = gpd.read_file(geodata_url)

De geboortedata kan nu gekoppeld worden aan de gemeentegrenzen met merge.

# Koppel CBS-data aan geodata met regiocodes
gemeentegrenzen = pd.merge(gemeentegrenzen, data,
                           left_on = "statcode", 
                           right_on = "Codering_3")

Tot slot kan de thematische kaart gemaakt worden met de functie plot.

# Maak een thematische kaart
p = gemeentegrenzen.plot(column='GeboorteRelatief_25', 
                         figsize = (10,8))
p.axis('off')
p.set_title('Levend geborenen per 1000 inwoners, 2017')

Thematische kaart van geboortecijfers in Nederland.