library(rnaturalearth) # Offene Datenbank zu Kontinental-, Länder- und Stadtgrenzen.
library(tmap) # Erstellung von Landkarten
library(sf) # Simple Features: GeometriepaketLernziele 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:
rnaturalearthvon South, 2023tmapvon Tennekes, 2018sfvon Pebesma, 2018
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)
)