Landkarten in R

Karten in Grafiken

Karten
R
Author

Markus Burkhardt

Published

March 3, 2023

Lernziele in R

In meinem Beitrag Reise, um zu Gewinnen haben wir eine illustrative Landkarte mit statistischen Informationen erstellt. Hier zeige ich, wie das geht.

Pakete

Für unsere Grafiken benötigen wir folgende Pakete:

library(rnaturalearth) # Offene Datenbank zu Kontinental-, Länder- und Stadtgrenzen.
library(tmap) # Erstellung von Landkarten
library(sf) # Simple Features: Geometriepaket

Umrisskarte

Nun zeichnen wir zuerst eine Umrisskarte von Deutschland.

# Ermittle die Koordinaten der Grenzen von Deutschland
de <- ne_countries(country = "Germany") 
#de <- st_as_sf(de)
# Wir zeichnen eine Karte von Deutschland
tm_shape(de) +
  tm_fill(col = "moccasin") +
  tm_borders(col = "black") 

Städte

Die Städte zeichnen wir mit Hilfe ihrer Koordinaten (Geolocation) ein. Im Beitrag Reise, um zu Gewinnen haben wir bereits eine Möglichkeit kennengelernt, um den Geocode von Städten zu ermitteln. Im Datensatz FBL1_coord.csv sind die Daten der 1. Bundesliga mit den Koordinaten der Städte enthalten:

library(readr)
FBL1_coord <- read_delim(
  "https://www-user.tu-chemnitz.de/~burma/blog_data/FBL1_coord.csv", 
  delim = ";", escape_double = FALSE, 
  locale = locale(decimal_mark = ",", encoding = "ISO-8859-1"), 
  trim_ws = TRUE)
head(FBL1_coord)
# A tibble: 6 x 9
    tab games  wins  draw  loss  year city          x     y
  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>     <dbl> <dbl>
1     1    30    17    11     2    63 Köln       6.96  50.9
2     2    30    13    13     4    63 Duisburg   6.76  51.4
3     3    30    16     7     7    63 Frankfurt  8.68  50.1
4     4    30    14     5    11    63 Dortmund   7.47  51.5
5     5    30    13     7    10    63 Stuttgart  9.18  48.8
6     6    30    11    10     9    63 Hamburg   10.0   53.6

Um die Städte einzuzeichnen, müssen wir zunächst die Koordinaten mit st_as_sf() in ein allgemeines Koordinatensystem überführen. Anschließend können wir die Städte einzeichnen.

# Koordinaten der Saison 2018/2019 auf das Zeichenfeld anpassen:
FBL1_18_sf <- st_as_sf(FBL1_coord[FBL1_coord$year == 18, ], coords = c("x","y"), crs = st_crs(de)$proj4string)

# Einzeichnung der Städte in die Deutschlandkarte 
tm_shape(de) +
  tm_fill(col = "moccasin") +
  tm_borders(col = "black") +
  tm_shape(FBL1_18_sf) +
  tm_dots(size = 1) 

Weitere Informationen

Schließlich können wir noch die Distanzen, die Anzahl der Siege und die Namen der Städte integrieren.

tm_shape(de) +
  tm_fill(col = "grey90") +
  tm_borders(col = "grey40") +

  tm_shape(FBL1_18_sf) +
  tm_bubbles(
    size = "wins",
    col = "wins",
    palette = "Blues",
    border.col = "white",
    alpha = 0.8,
    scale = 1.5,
    title.size = "wins"
  ) +

  tm_text(
    text = "city",
    size = 0.7,
    auto.placement = TRUE,   # versucht Overplotting zu vermeiden
    bg.color = "white",      # Hintergrund hinter dem Text
    bg.alpha = 0.6
  ) +

  tm_layout(
    legend.outside = TRUE,
    legend.outside.position = "right",
    legend.title.size = 1.0,
    legend.text.size  = 0.8,
    frame = TRUE,
    inner.margins = c(0.05, 0.02, 0.05, 0.02)
  )