Chapitre 15 Annexe : créer des cartes avec tmap

tmap est un package dédié à la réalisation de cartes sous R.

La syntaxe est très proche de ggplot, avec l’opérateur + pour enchaîner les options.

L’équivalent des geom_xx() dans tmap sont les fonctions suivantes :

  • tm_lines() : afficher des lignes
  • tm_polygons() : afficher des polygones
  • tm_raster() : afficher un raster
  • tm_bubbles() : afficher des ronds proportionnels
  • tm_markers() : afficher des marqueurs
  • tm_text() : afficher du texte

Les différences avec ggplot2 :

  • Les variables s’appellent dans des cotes "" ;
  • Le facetting peut se faire sur des données au format large (une carte par colonne et non une carte par modalité d’une variable) ;
  • Les fonctions tm_xx() incluent la définition des classes (nombre de classe, définition des classes et des palettes) sans passer par une fonction scale() dont l’équivalent n’existe pas.

La mise en page se définit avec la fonction tm_layout(), la légende avec tm_legend()

Dans ce chapitre nous allons utiliser les packages suivants

# CRAN
library(sf)
library(tidyverse)
library(tmap)
library(tmaptools)
library(viridis)
# Github
library(variousdata)   # remotes::install_github("MaelTheuliere/variousdata")

15.1 Fonction tm_shape()

Pour charger une donnée géométrique à visualiser avec {tmap}, il faut utiliser la fonction tm_shape(). tm_shape() initie la création de la carte, en fixant plusieurs options de base de notre carte : la projection, la bbox, un facteur de simplification…

data("World")
wgs_84 <- tm_shape(World, projection = st_crs(4326)) + 
  tm_polygons() + 
  tm_layout("Le monde en projection WGS84", inner.margins=c(0,0,.1,0), title.size=.8)

robin <- tm_shape(World, projection = st_crs("+proj=wintri")) + 
  tm_polygons() +
  tm_layout("Le monde en projection Winkel-Tripel", inner.margins=c(0,0,.1,0), title.size=.8)

15.2 Exemple de carte choroplèthe

La fonction tm_polygons() permet de faire des cartes choroplèthe.

Nous partons ici des banque d’indicateurs internationaux tenue par l’ONU sur les Objectifs de développement durable, diffusée dans le package {variousdata}.

15.2.1 Préparation des données

On prépare les données en associant les indicateurs à leur géographie.

sdg_indicators_sf <- World %>%
  left_join(sdg_indicators, by = c("iso_a3", "continent")) %>%
  st_transform(crs = st_crs(3857)) 

15.2.2 Cartographie

On réalise une analyse thématique de la variable sh_sta_mmr qui représente le taux de mortalité de la mère à la naissance (Maternal mortality ratio).

sdg_indicators_sf %>% 
  filter(timeperiod == "2015") %>% 
  tm_shape() +
  tm_polygons("sh_sta_mmr", textNA = "Valeur manquante") +
  tm_borders("white", lwd = .5)

15.3 Exemple de carte à ronds proportionnels

La fonction tm_bubble() permet de faire des cartes à ronds proportionnels. L’utilisation de tm_polygons() permet sans lui spécifier de paramètre d’afficher les frontières des pays avec une couleur de remplissage par défaut.

sdg_indicators_sf %>% 
  filter(timeperiod == "2015") %>% 
  tm_shape() +
  tm_polygons() +
  tm_bubbles(size = "sh_sta_mmr", col = "sh_sta_mmr", textNA = "Valeur manquante")

15.4 Discretisation

Pour définir comment notre variable continue va être discrétisée, deux méthodes :

  • discrétiser à la main et indiquer les valeurs limites dans l’option breaks de notre tm_xx

  • utiliser l’option style des tm_xx qui permettent de choisir un algorithme de discrétisation.

La méthode de jenks par exemple permet de maximiser la variance interclasse.

sdg_indicators_sf %>% 
  filter(timeperiod == "2015") %>% 
  tm_shape()+
  tm_polygons("sh_sta_mmr", textNA = "Valeur manquante", style="jenks")

L’option n = permet d’imposer un nombre de classes à la méthode utilisée.

sdg_indicators_sf %>% 
  filter(timeperiod == "2015") %>% 
  tm_shape() +
  tm_polygons("sh_sta_mmr", textNA = "Valeur manquante", style = "jenks", n = 3)

15.5 Exemples de cartes avec facet

tm_facets() permet de réaliser des cartes à facette avec la même logique que celle de ggplot2.

sdg_indicators_sf %>%
  filter(timeperiod %in% c("2000", "2005", "2010", "2015")) %>%
  tm_shape() +
  tm_polygons("sh_sta_mmr", textNA = "Valeur manquante", style = "jenks") +
  tm_facets("timeperiod")

15.6 Gestion des palettes

La fonction tmaptools::palette_explorer() permet d’accéder à une interface très simple de définition d’une palette de couleur à partir des palette brewer.

sdg_indicators_sf %>% 
  filter(timeperiod == "2015") %>% 
  tm_shape() +
  tm_polygons("sh_sta_mmr", textNA = "Valeur manquante", style = "jenks", 
              palette = get_brewer_pal("OrRd", n = 5, contrast = c(0.2, 1), plot = FALSE))

On peut également utiliser n’importe qu’elle palette, par exemple la palette viridis, mais sans l’interface proposée par palette_explorer() :

sdg_indicators_sf %>% 
  filter(timeperiod == "2015") %>% 
  tm_shape()+
  tm_polygons("sh_sta_mmr", textNA = "Valeur manquante", style = "jenks",
              palette = viridis(5, alpha = 1, begin = 0.3, end = 1, direction = 1, option = "D"))

15.7 La mise en page

tm_layout() permet de contrôler les polices, la légende, les marges, les couleurs. L’option design.mode = TRUE permet de voir visuellement les marges, la position de la légende. Le titre de la légende ne se définit pas dans tm_layout() mais dans tm_polygons().

L’option title de ces fonctions est l’équivalent d’un libellé de la variable mise dans l’aesthetic.

On peut rajouter une barre d’échelle et la flèche du nord avec tm_scale_bar() et tm_compass().

sdg_indicators_sf %>% 
  filter(timeperiod == "2015") %>% 
  tm_shape()+
  tm_polygons("sh_sta_mmr",textNA = "Valeur manquante", style = "jenks",
              palette = viridis(5, alpha = 1, begin = 0.3, end = 1, direction = 1, option = "D"),
              title = "Taux de mortalité de la mère \n(pour 100 000 naissances)")+
  tm_layout(main.title = "Taux de mortalité de la mère \n(pour 100 000 naissances) dans le monde",
            main.title.size = 1.2,
            bg.color = "skyblue",
            legend.position = c("left","bottom"),
            legend.bg.color = "white",
            legend.bg.alpha = .4,
            legend.outside = FALSE,
            main.title.position = "center",
            frame = FALSE)+
  tm_scale_bar(position = c("center","bottom"))+
  tm_compass(position = c("right","top"))

Avec les cartes en ronds proportionnels, on peut spécifier un titre pour la couleur et la taille du rond.

sdg_indicators_sf %>% 
  filter(timeperiod == "2015") %>% 
  tm_shape()+
  tm_polygons()+
  tm_bubbles(size="sh_sta_mmr",col="sh_sta_mmr",style="jenks",
             palette=viridis(5, alpha = 1, begin = 0, end = 1, direction = 1, option = "D"),
              title.col="",
              title.size="Taux de mortalité de la mère \n(pour 100 000 naissances)")+
  tm_layout(main.title="Taux de mortalité de la mère \n(pour 100 000 naissances) dans le monde",
            main.title.size=1.2,
            outer.margins=c(0,0,0,0),
            legend.position=c("left","bottom"),
            legend.outside = FALSE,
            main.title.position = "center",
            inner.margins = c(0, 0, 0, 0),
            frame = FALSE)+
    tm_scale_bar(position = c("center","bottom"))+
    tm_compass(position = c("right","top"))

15.8 Assembler plusieurs cartes

tmap_arrange() permet d’assembler plusieurs cartes ensemble. La limite de tmap_arrange() : la fonction ne permet pas de fixer un vecteur de largeur différent pour les cartes. A utiliser donc sur des cas qui peuvent convenir à cette contrainte.

bbox_africa <- World %>% 
  filter(continent=="Africa") %>% 
  st_bbox()

tmap_sdg_indicators <- sdg_indicators_sf %>%
  filter(timeperiod == "2015") %>%
  tm_shape()+
  tm_polygons("sh_sta_mmr", style = "jenks",palette = viridis(5, alpha = 1, begin = 0.3, end = 1, direction = 1, option = "D"))+
  tm_layout()

tmap_sdg_indicators_africa <- sdg_indicators_sf %>%
  filter(timeperiod == "2015") %>%
  tm_shape(bbox = bbox_africa)+
  tm_polygons("sh_sta_mmr", style = "jenks",
              palette = viridis(5, alpha = 1, begin = 0.3, end = 1, direction = 1, option = "D"))+
  tm_layout(legend.show = FALSE)

tmap_arrange(tmap_sdg_indicators, tmap_sdg_indicators_africa, nrow = 1)

15.9 tmap pour le web

tmap permet simplement de convertir une carte image en carte interactive. Pour cela il faut changer le mode d’affichage de la carte avec tmap_mode()

tmap_mode("view")

sdg_indicators_sf %>% 
  filter(timeperiod == "2015") %>% 
  tm_shape()+
  tm_polygons("sh_sta_mmr")+
  tm_borders("white", lwd = .5)

15.10 Export d’une carte

La fonction tmap_save() permet d’exporter une carte tmap. Suivant le tmap_mode() activé, l’export peut se faire en fichier image ou en fichier html.

carte <- sdg_indicators_sf %>%
  filter(timeperiod == "2015") %>%
  tm_shape() +
  tm_polygons() +
  tm_bubbles(
    size = "sh_sta_mmr", col = "sh_sta_mmr",
    palette = viridis(5, alpha = 1, begin = 0.3, end = 1, direction = 1, option = "D"),
    title.col = "",
    title.size = "Taux de mortalité de la mère \n(pour 100 000 naissances)"
  ) +
  tm_layout(
    main.title = "Taux de mortalité de la mère \n(pour 100 000 naissances) dans le monde",
    main.title.size = 1.2,
    outer.margins = c(0, 0, 0, 0),
    legend.position = c("left", "bottom"),
    legend.outside = FALSE,
    main.title.position = "center",
    inner.margins = c(0, 0, 0, 0)
  )

tmap_mode("plot")
tmap_save(carte, filename = "Taux de mortalité de la mère dans le monde.png")

tmap_mode("view")
tmap_save(carte, filename = "Taux de mortalité de la mère dans le monde.html")