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 lignestm_polygons(): afficher des polygonestm_raster(): afficher un rastertm_bubbles(): afficher des ronds proportionnelstm_markers(): afficher des marqueurstm_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 fonctionscale()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, crs = st_crs(4326)) +
tm_polygons() +
tm_title("Le monde en projection WGS84") +
tm_layout(inner.margins=c(0, 0, .1, 0), title.size=.8)
robin <- tm_shape(World, crs = st_crs("+proj=wintri")) +
tm_polygons() + tm_title("Le monde en projection Winkel-Tripel") +
tm_layout(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.
data(sdg_indicators) # chargement des données dans l'environnement
World <- World %>%
filter(name != "Somaliland") # elimination d'un doublon pour le code iso_a3 "SOM"
sdg_indicators_sf <- World %>%
left_join(sdg_indicators, by = c("iso_a3", "continent"), relationship = "one-to-many") %>%
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_options(label.na = "Valeur manquante") +
tm_polygons(fill = "sh_sta_mmr") +
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_options(label.na = "Valeur manquante") +
tm_polygons() +
tm_bubbles(size = "sh_sta_mmr", fill = "sh_sta_mmr")
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 via le parametre
fill.scale = tm_scale_intervals(breaks = c(...))de notretm_xxutiliser l’option
styledetm_scale_intervals()qui permet 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", fill.scale = tm_scale_intervals(style="jenks")) +
tm_options(label.na = "Valeur manquante") 
L’option n = de tm_scale_intervals() 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", fill.scale = tm_scale_intervals(style="jenks", n = 3)) +
tm_options(label.na = "Valeur manquante") 
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(fill = "sh_sta_mmr", fill.scale = tm_scale_intervals(style="jenks" )) +
tm_facets("timeperiod", ncol = 2) +
tm_options(label.na = "Valeur manquante") 
15.6 Gestion des palettes
{tmap} s’appuie sur le package {cols4all} pour la gestion des couleurs.
La fonction cols4all::c4a_gui() permet d’accéder à une interface de sélection d’une palette de couleurs pour {tmap} à partir de familles de palettes pré-existantes et de critères comme le type de palettes (progressive, catégorielle…) ou l’accessibilité visuelle.

Une fois le choix opéré, il faut noter le nom (‘name’) de la palette pour l’utiliser au niveau de la fonction d’étalonnage des couleurs fill.scale() à l’aide du paramètre values :
sdg_indicators_sf %>%
filter(timeperiod == "2015") %>%
tm_shape() +
tm_polygons("sh_sta_mmr", fill.scale = tm_scale_intervals(n = 5, style = "jenks", values = "brewer.or_rd",
values.range = c(0.2, 1), label.na = "Valeur manquante"))
Autre exemple avec la palette viridis :
sdg_indicators_sf %>%
filter(timeperiod == "2015") %>%
tm_shape() +
tm_polygons("sh_sta_mmr", fill.scale = tm_scale_intervals(n = 5, style = "jenks", values = "viridis",
values.range = c(0.3, 1), label.na = "Valeur manquante"))
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 de ggplot.
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", fill.scale = tm_scale_intervals(n = 5, style = "jenks", values = "viridis",
values.range = c(0.3, 1), label.na = "Valeur manquante"),
fill.legend = tm_legend("Taux de mortalité de la mère \n(pour 100 000 naissances)")) +
tm_title("Taux de mortalité de la mère \n(pour 100 000 naissances) dans le monde", size = 1.2) +
tm_layout(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_scalebar(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_options(label.na = "Valeur manquante") +
tm_polygons() +
tm_bubbles(size = "sh_sta_mmr", fill = "sh_sta_mmr",
fill.scale = tm_scale_intervals(n = 5, style = "jenks", values = "viridis"),
fill.legend = tm_legend(""),
size.legend = tm_legend("Taux de mortalité de la mère \n(pour 100 000 naissances)")) +
tm_title("Taux de mortalité de la mère \n(pour 100 000 naissances) dans le monde", size = 1.2) +
tm_layout(outer.margins = c(0, 0, 0, 0), inner.margins = c(0, 0, 0, 0),
legend.position = c("left","bottom"),
legend.outside = FALSE, main.title.position = "center",
frame = FALSE) +
tm_scalebar(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", fill.scale = tm_scale_intervals(n = 5, style = "jenks", values = "viridis",
values.range = c(0.3, 1), label.na = "Valeur manquante"))
tmap_sdg_indicators_africa <- sdg_indicators_sf %>%
filter(timeperiod == "2015") %>%
tm_shape(bbox = bbox_africa) +
tm_polygons("sh_sta_mmr", fill.scale = tm_scale_intervals(n = 5, style = "jenks", values = "viridis",
values.range = c(0.3, 1), label.na = "Valeur manquante")) +
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()
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_options(label.na = "Valeur manquante") +
tm_polygons() +
tm_bubbles(size = "sh_sta_mmr", fill = "sh_sta_mmr",
fill.scale = tm_scale_intervals(n = 5, style = "jenks", values = "viridis"),
fill.legend = tm_legend(""),
size.legend = tm_legend("Taux de mortalité de la mère \n(pour 100 000 naissances)")) +
tm_title("Taux de mortalité de la mère \n(pour 100 000 naissances) dans le monde", size = 1.2) +
tm_layout(outer.margins = c(0, 0, 0, 0), inner.margins = c(0, 0, 0, 0),
legend.position = c("left", "bottom"), legend.outside = FALSE,
main.title.position = "center", frame = FALSE) +
tm_scalebar(position = c("center","bottom")) +
tm_compass(position = c("right","top"))
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")