37  Karten plotten

Ich möchte meine Daten mit Landschaftskarten kombinieren!

37.1 Deutschland

Wir verwenden zum plotten das Zusatzpaket sf, mit dessen Hilfe shape geopackages verarbeitet werden können. Das zu diesem Format passende Kartenmaterial wird vom Bundesamt für Kartographie und Geodäsie kostenfrei zur Verfügung gestellt, siehe https://gdz.bkg.bund.de/index.php/default/digitale-geodaten/verwaltungsgebiete.html. Als Starterpaket ist der Datensatz der Verwaltungsgebiete VG2500 zu empfehlen. Dieser enthält die Verwaltungsebenen vom Staat bis zu den Kreisen mit den jeweiligen Grenzen:

  • VG2500_STA - Staat
  • VG2500_LAN - Bundesländer
  • VG2500_RBZ - Regierungsbezirke
  • VG2500_KRS - Kreise

Dabei besteht jeder Kartensatz aus den Unterdateien

  • *.shp - Shape-Datei. Diese lesen wir in R ein
  • *.shx - Geometrieindex
  • *.prj - Projektion
  • *.dbf - Attribute
  • *.cpg - Zeichensatz

37.1.1 Kartendaten einlesen

Sind die Kartendaten heruntergeladen, müssen alle Dateien (nicht nur die .shp Datei) mit Dateinamen VG2500_KRS (beispielhaft für Kreise) in den R-Studio-Projektordner gelegt werden. Ich persönlich habe dort den Unterordner data erstellt, von dem aus ich die Daten einlese. Der Import erfolgt mit der Funktion read_sf() wie folgt:

# Paket aktivieren
library(sf)
## Linking to GEOS 3.12.2, GDAL 3.9.0, PROJ 9.4.1; sf_use_s2() is TRUE
# Lade Kartendaten der Bundesländer
bundeslaender <- read_sf("data/VG2500_LAN.shp")

# anschauen
head(bundeslaender)
## Simple feature collection with 6 features and 24 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: 280353.1 ymin: 5471359 xmax: 674168.3 ymax: 6101335
## Projected CRS: ETRS89 / UTM zone 32N
## # A tibble: 6 × 25
##   OBJID BEGINN       ADE    GF   BSG ARS   AGS   SDV_ARS GEN   BEZ     IBZ BEM  
##   <chr> <date>     <int> <int> <int> <chr> <chr> <chr>   <chr> <chr> <int> <chr>
## 1 DEBK… 2021-09-01     2     9     1 01    01    010020… Schl… Land     20 --   
## 2 DEBK… 2021-09-01     2     9     1 02    02    020000… Hamb… Frei…    22 --   
## 3 DEBK… 2021-09-01     2     9     1 03    03    032410… Nied… Land     20 --   
## 4 DEBK… 2021-09-01     2     9     1 04    04    040110… Brem… Frei…    23 --   
## 5 DEBK… 2021-09-01     2     9     1 05    05    051110… Nord… Land     20 --   
## 6 DEBK… 2021-09-01     2     9     1 06    06    064140… Hess… Land     20 --   
## # ℹ 13 more variables: NBD <chr>, SN_L <chr>, SN_R <chr>, SN_K <chr>,
## #   SN_V1 <chr>, SN_V2 <chr>, SN_G <chr>, FK_S3 <chr>, NUTS <chr>, ARS_0 <chr>,
## #   AGS_0 <chr>, WSK <date>, geometry <MULTIPOLYGON [m]>
# Lade Kartendaten der Kreise
kreise <- read_sf("data/VG2500_KRS.shp")
head(kreise)
## Simple feature collection with 6 features and 24 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: 478836.8 ymin: 5913378 xmax: 629246.8 ymax: 6075267
## Projected CRS: ETRS89 / UTM zone 32N
## # A tibble: 6 × 25
##   OBJID BEGINN       ADE    GF   BSG ARS   AGS   SDV_ARS GEN   BEZ     IBZ BEM  
##   <chr> <date>     <int> <int> <int> <chr> <chr> <chr>   <chr> <chr> <int> <chr>
## 1 DEBK… 2021-09-01     4     9     1 01001 01001 010010… Flen… Krei…    40 --   
## 2 DEBK… 2021-09-01     4     9     1 01002 01002 010020… Kiel  Krei…    40 --   
## 3 DEBK… 2021-09-01     4     9     1 01003 01003 010030… Lübe… Krei…    40 --   
## 4 DEBK… 2021-09-01     4     9     1 01004 01004 010040… Neum… Krei…    40 --   
## 5 DEBK… 2021-09-01     4     9     1 01051 01051 010510… Dith… Kreis    42 --   
## 6 DEBK… 2021-09-01     4     9     1 01053 01053 010530… Herz… Kreis    42 --   
## # ℹ 13 more variables: NBD <chr>, SN_L <chr>, SN_R <chr>, SN_K <chr>,
## #   SN_V1 <chr>, SN_V2 <chr>, SN_G <chr>, FK_S3 <chr>, NUTS <chr>, ARS_0 <chr>,
## #   AGS_0 <chr>, WSK <date>, geometry <MULTIPOLYGON [m]>

Die in den Datensätzen für uns interessanten Variablen sind ARS (Amtlicher Regionalschlüssel), AGS (Amtlicher Gemeindeschlüssel) und GEN (geographischer Name), denn über diese können die entsprechenden Flächen der Karte manipuliert werden. Die eigentlichen Positionsangaben sind in der Variable geometry enthalten.

37.1.2 Karten erzeugen

Erzeugen wir zunächst eine grobe Deutschlandkarte der Bundesländer mit ggplot(). Hierfür kann die Funktion geom_sf() genutzt werden.

library(ggplot2)
# Hier wird eine weiße Karte der Bundesländer
# mit schwarzen Grenzen und dünner Linie gezeichnet
ggplot(bundeslaender) +
  geom_sf(fill="white", color="black", linewidth=0.3) +
  theme_void()

# Hier eine Karte der Kreise
ggplot(kreise) +
  geom_sf(fill="white", color="black", linewidth=0.3) +
  theme_void()

37.1.3 Kacheln füllen

Auf den Seiten des Bundesinstituts für Bau-, Stadt-, und Raumforschung können interessante Kennzahlen heruntergeladen werden, siehe https://www.inkar.de. Die Daten aus Tabelle Bevoelkerung2022.txt stammen aus diesem riesigen Datensatz und beschreiben die Bevölkerungszahlen der Kreise von 2021 und 2022. Diese Daten sollen genutzt werden, um die Kartenkacheln einzufärben.

# Daten einlesen
Einwohner <- read.table(url("https://www.produnis.de/R/data/Bevoelkerung2022.txt"), 
                        header=TRUE, sep=",")
head(Einwohner)
##   Kennziffer            Raumeinheit Aggregat  J2021  J2022
## 1       1001       Flensburg, Stadt   Kreise  91113  90050
## 2       1002 Kiel, Landeshauptstadt   Kreise 246243 245217
## 3       1003     Lübeck, Hansestadt   Kreise 216277 215595
## 4       1004      Neumünster, Stadt   Kreise  79496  77002
## 5       1051           Dithmarschen   Kreise 133969 132752
## 6       1053    Herzogtum Lauenburg   Kreise 200819 201212

In der Spalte Kennziffer der Tabelle sind die amtlichen Regionalschlüssel enthalten. Diese stimmen mit den ARS und AGS Kennziffern aus den Kartendaten überein. Wir können also über diese Variable die Datensätze zusammenführen.

Beachten Sie, dass in der ersten Spalte führende Nullen angegeben sind. Um sicherzustellen, dass die führenden Nullen beim Einlesen in R erhalten bleiben, muss die Option colClasses="character" verwendet werden.

# Daten "richtrig" einlesen
Einwohner <- read.table(url("https://www.produnis.de/R/data/Bevoelkerung2022.txt"), 
                        header=TRUE, sep=",", colClasses = "character")
# Anschauen
head(Einwohner)
##   Kennziffer            Raumeinheit Aggregat  J2021  J2022
## 1      01001       Flensburg, Stadt   Kreise  91113  90050
## 2      01002 Kiel, Landeshauptstadt   Kreise 246243 245217
## 3      01003     Lübeck, Hansestadt   Kreise 216277 215595
## 4      01004      Neumünster, Stadt   Kreise  79496  77002
## 5      01051           Dithmarschen   Kreise 133969 132752
## 6      01053    Herzogtum Lauenburg   Kreise 200819 201212
# Datenniveaus anpassen, weil ja alles als
# "character" eingelesen wurde
Einwohner$Kennziffer <- factor(Einwohner$Kennziffer)
Einwohner$Raumeinheit <- factor(Einwohner$Raumeinheit)
Einwohner$Aggregat <- factor(Einwohner$Aggregat)
Einwohner$J2021 <- as.numeric(Einwohner$J2021)
Einwohner$J2022 <- as.numeric(Einwohner$J2022)

In einer neuen Variable Diff soll die prozentuale Veränderung der Bevölkerungsanzahl von 2021 nach 2022 gespeichert werden.

Einwohner$Diff <- ((Einwohner$J2022 - Einwohner$J2021) / Einwohner$J2021)*100

Jetzt können wir die beiden Datensätze mittels left_join() über die Variablen Kennziffer und ARSzusammenführen.

library(dplyr)
# Einwohnerzahlen und Kartenmaterial verbinden
kreise2 <- left_join(kreise, Einwohner, 
                     join_by(ARS==Kennziffer))

Das neue Objekt kreise2 kann nun zum Plotten verwendet werden. Hierbei werden die Kartensegmente in Abhängigkeit zur prozentualen Bevölkerungsveränderung eingefärbt. Um einen schönen Farbverlauf zu erzeugen, nutzen wir die muted() Funktion aus dem scales Paket.

library(scales)
ggplot(kreise2) + 
  geom_sf(aes(fill=Diff),linewidth =0, alpha=0.9) +
  # Färbefarben festlegen
  scale_fill_gradient2(low=muted("red"), 
                       mid="lightyellow", high= muted("green"), 
                       midpoint=0, na.value="black") +
  coord_sf() + 
  # Legende der Färbung
  guides(fill=guide_colorbar(barwidth=0.5, 
                             barheight=10, 
                             title="Veränderung in %"))

Die Karten können auch kombiniert werden. So könnten wir unserer Karte noch die Bundsländergrenzen hinzufügen.

# nochmal der selbe Plot
ggplot(kreise2) + 
  geom_sf(aes(fill=Diff),linewidth =0, alpha=0.9) +
  # Färbefarben festlegen
  scale_fill_gradient2(low=muted("red"), 
                       mid="lightyellow", high= muted("green"), 
                       midpoint=0, na.value="black") +
  coord_sf() + 
  # Legende der Färbung
  guides(fill=guide_colorbar(barwidth=0.5, 
                             barheight=10, 
                             title="Veränderung in %")) + 
  # Grenzen der Bundesländer drüberlegen
  geom_sf(data=bundeslaender, fill=NA, color="black", linewidth=0.3)
## Coordinate system already present. Adding new coordinate system, which will
## replace the existing one.