5  Visualisering 2: Kort


Det her er en introduktion til, hvordan man laver kort i R. Som et led i en eksplorativ dataanalyse, kan det være uhyre nyttigt at placere ting i rum. Samtidig er kort et glimrende formidlingsredskab.
R har en lang række pakker, der gør det muligt at arbejde med geografiske data. Det bliver hurtigt ret avanceret. Det kan dog være en fordel at lære at lave simple kort direkte med ggplot2. Det gør det muligt at lave kort, der bruger samme konventioner som de visualiseringer, man typisk ellers laver i R.

5.0.1 Setup

Datasættet om fængselsophold indeholder ikke brugbare geografiske data. For at demonstrere, hvordan man laver kort bruger vi i stedet et datasæt med signalementer af fanger ført i samme fængsel Stokhusslaveriet fra 1807—1832. Data kan downloades her:

library(tidyverse)
library(readxl)

# Load signalementerne
df <- read_csv2("data/Signalementer_ekstra.csv")

Datasættet indeholder kolonnerne Breddegrad og Længdegrad. Alle fødesteder, der optræder mindst 2 gange i datasættet har koordinater. I resten optræder værdien NA.

5.0.2 Lav dit første kort

For at kunne plotte datapunkterne skal vi imidlertid også bruge et kort. R-pakken rnaturalhires indeholder vektordata af høj kvalitet. Den er dog ikke tilgængelig via CRAN. Den skal derfor installeres ved hjælpe af en anden pakke “remotes”. Husk, at hvis du ikke har pakken “remotes”, skal denne også installeres først ved hjælp af funktionen install.packages().

#Installer hi-res vektorkort
library(remotes)
remotes::install_github("ropensci/rnaturalearthhires")

Det kan godt være nødvendigt med en genstart efter at have kørt dette kode. Du behøver ikke køre det hver gang, for når det først er installeret, kan pakken bruges som alle andre pakker.
Vi er nu klar til at skabe et kort.

library(rnaturalearthhires)
library(rnaturalearth)
library(sf)

# Skab et geografisk objekt
ne_world <- ne_countries(scale = "large", returnclass = "sf")

# Plot det
ggplot(ne_world) +
  geom_sf(colour = "lightgrey", 
          fill = "lightgrey", 
          size = 0.1) +
  coord_sf(crs = "ESRI:102013", 
           default_crs = st_crs(4326), 
           xlim = c(0, 20), ylim = c(50, 63))

Udsnittet specificeres ved hjælp af “xlim” og “ylim” i “coord_sf”. Bemærk hvordan kortet allerede indeholder en projektion. Denne specificeres ved argumentet “crs” i “coord_sf”. Dermed konverteres fra det eksisterende koordinatsystem (“default_crs”) til et andet. Hvis man googler “GIS crs” kan man finde lange lister med projektioner, der på forskellige måder forsøger at tage højde for, at kloden ikke er flad. Man kan selvfølgelig også bare antage, at det er den, men så ser ens kort ligeså dumt ud, som alt andet man foretager sig.
Uanset var vores ærinde jo at plotte personerne fra signalementerne. Lad os bruge vores kort ovenfor og plotte nogle punkter ved hjælp af “geom_count”. Lad os også definere nogle æstetiske elementer ved vores plot.

# Plot nogle punkter, hvor størrelsen afspejler antal
ggplot(ne_world) +
  geom_sf(colour = "lightgrey", 
          fill = "lightgrey", 
          size = 0.1) +
  coord_sf(crs = "ESRI:102013", 
           default_crs = st_crs(4326), 
           xlim = c(0, 20), ylim = c(50, 63)) +
  geom_count(data = df, aes(x = Længdegrad, 
                            y = Breddegrad), 
             colour = "red", 
             alpha = 0.3) +
  theme_test() +
  theme(axis.text = element_blank(),
        axis.ticks = element_blank()) +
  scale_size(range = c(1, 10)) +
  ylab("") +
  xlab("") +
  ggtitle("De fængsledes fødesteder")

Fordi kortet er lavet i ggplot, kan du bruge alle de samme tricks, man normalt bruger. F.eks. kan argumenter som “colour” og “fill” føjes til “aes” og bruges til at plotte forskellige grupper. Man kan også gemme ved at bruge “ggsave”, nøjagtigt som man ville forvente.

Geom_count

Ovenfor brugte vi geomet geom_count. Det opfører sig i de fleste henseende som geom_point med den væsentlige forskel, at punktet vokser, hvis der er flere observationer med samme værdi.

5.0.3 Lav dit første interaktive kort

I mange kontekster producerer vi ikke kort til print. Derfor kan vi inkludere interaktive elementer. I eksemplet her, kan man klikke på hvert punkt og læse signalementet af en straffefange. Til det formål er pakken Leaflet til hjælp.

library(leaflet)
library(tidyverse)

# Find på en titel til kortet
Kort_titel <- "Stokhusslavernes fødesteder."

# Lav kortet
leaflet() %>%
  addTiles() %>%
  addProviderTiles("Esri.WorldGrayCanvas") %>%
  addCircleMarkers(
    lng = df$Længdegrad,
    lat = df$Breddegrad,
    popup = df$org_text,
    label = df$Navn,
    radius = 0.5,
    opacity = 1,
    color = "black",
    fill = TRUE,
    fillOpacity = 1,
    popupOptions = popupOptions(maxWidth = 200)) %>%
  setView(lng = -2, lat = 20, zoom = 2) %>%
  addControl(Kort_titel, position = "bottomleft")

Leaflet er designet til at lave kort på nettet, og den tekst, der popper op, når man klikker på punkterne kan styles på mange forskellige måder ved hjælp af de forventelige konventioner for html.