Faire des cartes thématiques avec R

GEO UNIV’R Tunisie 2024

Author

Nicolas Lambert, Ronan Ysebaert, Elina Marveaux

Published

March 11, 2025

Note

Ce support est très largement inspiré du manuel Cartographie avec R réalisé par Timothée Giraud et Hugues Pécout. Et on les en remercie chaleureusement 🙏

Pakages utilisés dans cette session.

Les principaux packages utilisés dans cette section sont :

  • sf
  • mapsf

Initiez un nouveau projet

  • Créez un nouveau répertoire de travail.
  • Ouvrez Rstudio.
  • Créez un nouveau projet et placez-le dans votre dossier.
  • Créez un nouveau document Quarto (ou éventuellement un simple script R si vous préférez)

Si vous n’avez pas les packages listés plus haut, vous pouvez les installer en tapant la ligne suivante dans la console.

install.packages(c('sf', 'mapsf'))

Dans cette séquence, nous travaillons à l’échelle des pays africains. Les données statistiques sont issues de la base de données de la banque mondiale.

Télécharger le jeu de données

Téléchargez-le dossier Africa.zip, dézippez-le et placez-les données dans un répertoire data.

Tout est prêt 😎

Import et mise en forme des données

1 - Import des géométries

library("sf")

On dispose d’un fichier geopackage contenant plusieurs géométries

st_layers("data/Africa/afrique.gpkg")
Driver: GPKG 
Available layers:
               layer_name     geometry_type features fields crs_name
1 ne_10m_populated_places             Point     1305    137   WGS 84
2            ne_10m_roads Multi Line String     6761     31   WGS 84
3        ne_10m_railroads Multi Line String      758     12   WGS 84
4                  africa           Polygon       55      4   WGS 84
5                   world           Polygon      209      4   WGS 84

On importe la couche correspondant aux pays africains et on la reprojette en projection Pseudo-Mercator.

geom <- st_transform(st_read("data/Africa/afrique.gpkg", layer = "africa"),"epsg:3857")
Simple feature collection with 4 features and 4 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -2702989 ymin: -2329942 xmax: 6434678 ymax: 1782119
Projected CRS: WGS 84 / Pseudo-Mercator
  ISO3            NAMEen             NAMEfr region
1  GNQ Equatorial Guinea Guinée-Équatoriale Africa
2  COM           Comoros            Comores Africa
3  CPV        Cape Verde           Cap-Vert Africa
4  MUS         Mauritius            Maurice Africa
                            geom
1 MULTIPOLYGON (((1260368 241...
2 MULTIPOLYGON (((4883099 -13...
3 MULTIPOLYGON (((-2660139 17...
4 MULTIPOLYGON (((6424679 -22...

2 - Import des données statistiques issues de la banque mondiale.

data <- read.csv("data/Africa/worldbank_africa.csv")
          id  type                                      description
1     region quali                                        subregion
2        pop stock                                Population, total
3        urb stock                                 Urban population
4      rural stock                                 Rural population
5   ruralpct ratio         Rural population (% of total population)
6        gdp stock                                GDP (current US$)
7      gdppc ratio                     GDP per capita (current US$)
8        esp ratio          Life expectancy at birth, total (years)
9       elec ratio          Access to electricity (% of population)
10    forest stock                             Forest area (sq. km)
11 forestpct ratio                     Forest area (% of land area)
12  articles stock        Scientific and technical journal articles
13  internet ratio Individuals using the Internet (% of population)
14   servers ratio   Secure Internet servers (per 1 million people)

3 - Jointure

africa <-  merge(
  x = geom[,"ISO3"],  
  y = data,  
  by.x = "ISO3",
  by.y = "id",
  all.x = TRUE   
)

On dispose maintenant du Spatial*DataFrame africa qui contient à la fois des données et des géométries.

Et on ajoute quelques couches additionnelles

world <- st_transform(st_read("data/Africa/afrique.gpkg", layer = "world"),"epsg:3857")
places <- st_transform(st_read("data/Africa/afrique.gpkg", layer = "ne_10m_populated_places"),"epsg:3857")
rail <- st_transform(st_read("data/Africa/afrique.gpkg", layer = "ne_10m_railroads"),"epsg:3857")
roads <- st_transform(st_read("data/Africa/afrique.gpkg", layer = "ne_10m_roads"),"epsg:3857")

1 - cartographie avec sf

Grâce au package sf, la fonction plot() est étendue et permet l’afficher d’un Spatial*DataFrame comme n’importe quel graphique.

Comportement par défaut

Par de faut, la fonction renvoie une image pouvant contenir jusqu’à 10 cartes, chaque carte correspondant à une colonne.

plot(africa)

Si il y a plus de 10 colonnes dans le jeu de données, alors on ajoute la paramètre max.plot = ncol(africa) - 1 (le nombre de colonnes total moins la colonne de géométries).

plot(africa, max.plot = ncol(africa) - 1)

On perçoit que les couleurs ne sont pas choisies totalement au hasard. Nous verrons un peu plus tard comme cela fonctionne.

Si on souhaite afficher simplement les géométries, on utilise la fonction st_geometry()

plot(st_geometry(africa))

Marges en emprise

Dans les affichages précédents, on constate qu’il y a beaucoup d’espace perdu autour de la carte. On peut modifier les marges en modifiant les paramètres graphiques. mar permet de mettre les marges à zéro. xaxs='i', yaxs='i' permettent de supprimer les espaces résiduels.

par(mar = c(0, 0, 0, 0),  xaxs='i', yaxs='i', bg = "#F1F3F5") # c(bottom, left, top, right))
plot(st_geometry(africa))

Quand on travaille dans un document quarto, il est également possible de modifier la taille des figures avec les paramètres fig-height et fig-width. Soit dans le yaml en haut du document. Soit directement dans le chunk.

Ici, on détermine le bon ratio entre la hauteur et la largeur.

bb <- st_bbox(africa)
ratio <- (bb$xmax - bb$xmin) / (bb$ymax - bb$ymin) 
height <- 6
width <- height * ratio
width
    xmax 
6.355375 

Puis on écrit

#| fig-height: 6
#| fig-width: 6.36

Et on obtient une carte qui prend bien tout l’espace souhaité.

par(mar = c(0, 0, 0, 0), bg = "#F1F3F5", xaxs='i', yaxs='i')
plot(st_geometry(africa))

Enfin, notez qu’avec xlim et ylim, vous pouvez cadrer la carte sur une emprise particulière. Par exemple ici, on affiche le fond de carte du monde mais uniquement avec l’emprise de l’Afrique.

par(mar = c(0, 0, 0, 0), xaxs='i', yaxs='i')
bb <- st_bbox(africa)
plot(st_geometry(world), xlim = c(bb$xmin, bb$xmax), ylim = c(bb$ymin, bb$ymax))

Paramétrer le style

De nombreux paramètres permettent de personnaliser le style de la carte. Nous en citons ici quelques exemples.

  • Couleur de fond : col
  • Couleur de contour : border
  • Epaisseur des tracés : lwd
par(mar = c(0, 0, 0, 0), bg = "#F1F3F5", xaxs='i', yaxs='i')
plot(st_geometry(africa), col = "#5b89a3", border = "white", lwd = 0.5)

NB : Il y a 657 noms de couleurs disponibles dans R. Pour les afficher, vous pouvez taper colors()

cols <- colors()
head(cols, 20)
 [1] "white"         "aliceblue"     "antiquewhite"  "antiquewhite1"
 [5] "antiquewhite2" "antiquewhite3" "antiquewhite4" "aquamarine"   
 [9] "aquamarine1"   "aquamarine2"   "aquamarine3"   "aquamarine4"  
[13] "azure"         "azure1"        "azure2"        "azure3"       
[17] "azure4"        "beige"         "bisque"        "bisque1"      

Avec lty, on peut également changer le type de traits

par(mar = c(0, 0, 0, 0), bg = "#F1F3F5", xaxs='i', yaxs='i')
plot(st_geometry(roads), lty = 3)

Avec pch, on peut choisir le s de symbole. Avec cex, on détermine sa taille.

par(mar = c(0, 0, 0, 0), bg = "#F1F3F5", xaxs='i', yaxs='i')
plot(st_geometry(places), pch = 17, col = "red", cex = 1)

Supperposer des couches

Pour superposer des couches, vous pouvez simplement utiliser le paramètre add = TRUE (sous réserve que les couches soient dans le même système de coordonnées)

par(mar = c(0, 0, 0, 0), bg = "#F1F3F5")
plot(st_geometry(africa), col = "#5b89a3", border = "white", lwd = 0.5)
plot(st_geometry(roads), col = "red", add = TRUE)
plot(st_geometry(places), pch = 19, col = 'black', cex = 0.5, add = TRUE)

Autres éléments

Il est possible d’ajouter d’autres éléments à la mise en page.

  • Les axes : axes = TRUE/FALSE
  • Graticule : graticule = TRUE
  • Titre = main = "Hello"

Par exemple :

par(mar = c(0, 0, 2, 0))
plot(st_geometry(africa), col= "white", axes = TRUE, graticule = TRUE, main = "Hello")

Effet d’ombrage

Avec R, il est aisé de translater une géométrie pour créer un effet d’ombrage.

par(mar = c(0, 0, 0, 0))
plot(st_geometry(africa) + c(50000,-50000), col = "#827e6c80", border = NA)
plot(st_geometry(africa) , col = "#5B89A3", border = NA, add = TRUE)

Astuce

On peut faire varier la transparence d’une couleur au format hexadécimal en ajouter un nombre de 00 à 99 à la fin du code. Par exemple #827e6c60 applique une opacité de 60% à la couleur #827e6c.

On peut même imaginer cet ombrage en dégardé avec une boucle

delta <- 20000
nb <- 15
par(mar = c(0, 0, 0, 0))
plot(st_geometry(africa) , col = NA, border = NA)
for (i in 1:nb) {
plot(st_geometry(africa) + c(i * delta,-i * delta), col = "#827e6c20", border = NA, add = TRUE)
}
plot(st_geometry(africa) , col = "#5B89A3", border = NA, add = TRUE)

Cartographie thématique

Avec le package sf, il est (un peu) possible de réaliser des cartes thématiques. Rappelez-vous les couleurs de tout à l’heure. Dans le cas où un seul attribut est sélectionné, une légende est attribuée par défaut à côté de la carte. Ici, une donnée qualitative.

plot(africa["region"])

Le positionnement de la légende peut être défini par le paramètre key.pos (1 = dessous, 2 = gauche, 3 = dessus et 4 = droite). Sa taille peut également être modifiée avec les paramètres key.width et key.length

plot(africa["region"], key.pos = 1, key.length = 1)

Si on souhaite cartographier une variable quantitative, la palette par défaut est différente.

plot(africa["pop"])

Grace au paramètre breaks, il est possible de donner ses propres classes de valeur ou de donner une méthode de discrétisation (méthodes du package classInt).

plot(africa["pop"], breaks = "jenks")

Exports

Ici, on a affiché toutes les cartes dans le document. Mais on peut également choisir de les construire dans un format donné (pdf, svg, png, ps, etc.), ce qui peut être utile pour les retravailler dans un logiciel de DAO. Par exemple, on peut écrire :

svg("my_plot.svg")
plot(st_geometry(africa))
dev.off() 

Bilan et limites

Que retenir ?

Les fonctions de cartographies dans les fonctionnalités de base de sf sont très limitées. On ne peut pas, par exemple, dessiner des symboles proportionnels et leur légende associée. Si on veut aller plus loin, on a besoin d’un package spécialisé en représentations cartographiques. C’est à ce besoin que répond le package mapsf.

2 - le package mapsf

mapsf permet de créer la plupart des types de carte utilisés habituellement en cartographie statistique (cartes choroplèthes, typologies, symboles proportionnels ou gradués…).

Pour chaque type de carte, plusieurs paramètres permettent de personnaliser la représentation cartographique. Ces paramètres sont les mêmes que ceux que l’on retrouve dans les logiciels de SIG ou de cartographie usuels. mapsf est le successeur du package cartography. Si vous avez l’habitude d’utiliser ce dernier, nous vous conseillons vivement d’utiliser dorénavant mapsf.

On charge le package

library("mapsf")

Documentation et supports

De nombreux documents permettent de prendre en main ce package.

Et surtout, il faut aller voir dans la documentation du package directement dans RStudio. Vous y découvrirez une magnifique vignette.

Afficher un fond de carte

La fonction mf_map() est la fonction centrale du package mapsf. Elle remplace la fonction plot. Elle permet de réaliser la plupart des représentations usuelles en cartographie. Par défaut, elle permet d’afficher un fond de carte.

mf_map(africa)

La fonction mf_title() permet d’ajouter un titre à la place de main. Avec add = TRUE, on peut supproposer des couches.

Astuce

En affichant une première couche avec border = NA et col = NA, on peut ajouter un calque vide pour fixer l’emprise de la carte

mf_map(x = africa, border = NA, col = NA)
mf_map(x = world, border = "white", col = "#CCCCCC50", lwd = 0.5, add = TRUE)
mf_map(x = africa, border = "white", col = "#6893d9", lwd = 0.5, add = TRUE)
mf_map(x = places, pch = 20, cex = .7, col = "darkred", add = TRUE)
mf_title(txt = "L'Afrique")

Astuce

Pour déterminer la taille de la figure, vous pouvez utiliser la fonction mf_get_ratio()

Symboles proportionnels

Pour représenter une donnée quantitative absolue (i.e. donnée de stock), on utilise la fonction mf_map avec le paramètre type = "prop"

mf_map(x = africa, border = "white", lwd = 0.5)
mf_map(x = africa,
       var = "pop",
       type = "prop",
       border = "white",
       col = "#FF000080",
       leg_title = "Nombre d'habitants\nen 2020",
       inches   = 0.4 # taille du plus grand symbole
)
mf_title(txt = "Population totale")

Astuce

Pour dessiner des carrés au lieu des cercles, vous pouvez utiliser symbol = "square"

Symboles gradués

Avec le type "grad", vous pouvez réaliser la même carte avec des symboles gradués (ce qui dans le cas de figure ici, est moins efficace). Pour cela, vous devez choisir un nombre de classes (nbreaks) et une méthode de discrétisation (breaks).

mf_map(x = africa, border = "white", lwd = 0.5)
mf_map(x = africa,
       var = "pop",
       type = "grad",
       nbreaks = 5,
       method = "quantile",
       border = "white",
       col = "#FF000080",
       leg_title = "Nombre d'habitants\nen 2020",
       inches   = 0.4)
mf_title(txt = "Population totale (classes de tailles)")

Carte choroplèthe

Pour représenter des données quantitatives relatives (ratio, indices, échelles…), on utilisera la plupart du temps des dégradés de couleurs. Dans mapsf, cela s’effectue avec le type "choro". Comme précédemment, les paramètres nbreaks et breaks permettent de paramétrer les discrétisations.

mf_map(x = africa,
       var = "gdppc",
       type = "choro",
       nbreaks = 5,
       border = "white",
       leg_title = "PIB par habitant\n(US$ courants)")
mf_title(txt = "Richesse des pays d'Anfrique en 2020")

Par défaut, la méthode de discrétisation est la méthode des quantiles. Elle s’adapte donc à n’importe quelle distribution de données. Mais avant de réaliser une carte choroplèthe, il est préférable d’étudier d’abord la distribution statistique de la variable que l’on souhaite cartographier. La fonction mf_distr() permet de visualiser cette distributions.

mf_distr(africa$gdppc)

Ici, la série est dissymétrique à gauche, on peut donc opter plutôt pour la méthode "geom" qui est adaptée à ce type de distribution (les méthodes disponibles sont : "fixed", "sd", "equal", "pretty", "quantile", "kmeans", "hclust", "bclust", "fisher", "jenks", "dpih", "q6", "geom", "arith", "em" ou "msd").

mf_map(x = africa,
       var = "gdppc",
       type = "choro",
       breaks = "geom",
       nbreaks = 4,
       border = "white",
       leg_title = "PIB par habitant\n(US$ courants)")
mf_title(txt = "Richesse des pays d'Afrique en 2020 (method = 'geom')")

Pour changer les couleurs, vous pouvez renseigner une palette de couleur avec l’argument pal. Par exemple :

pal = "Magenta"

Si vous le souhaitez, vous pouvez aussi choisir vos propres couleurs.

pal = c("#F3CAD2", "#E08BB1", "#AF4F91", "#6D1C68")

Ou créer une palette sur mesure avec la fonction mf_get_pal().

pal = mf_get_pal(n = c(6,3), palette = c("Burg", "Teal"))

Carte de typologie

Pour cartographier des données qualitatives, on utilise type = "typo".

mf_map(x = africa,
       var = "region",
       type = "typo",
       breaks = "geom",
       border = "white")
mf_title(txt = "Les grandes régions d'Afrique")

Astuce

L’argument val_order sert à ordonner les modalités dans la légende. Par exemple :

val_order = c("Northern Africa", "Eastern Africa", "Western Africa", "Middle Africa", "Southern Africa")

Combinaisons

Pour réaliser des cartes combinant deux variables, il est possible de superposer une carte choroplèthe et une carte de stock. Par exemple :

mf_map(x = africa,
       var = "gdppc",
       type = "choro",
       nbreaks = 5,
       border = "white",
       leg_pos = "topleft",
       leg_title = "PIB par habitant\n(US$ courants)")
mf_map(x = africa,
       var = "pop",
       type = "prop",
       border = "black",
       leg_pos = "bottomleft",
       col = NA,
       leg_title = "Nombre d'habitants\nen 2020",
       inches   = 0.4)
mf_title(txt = "Population et richesse en Afrique")

Mais vous pouvez aussi utiliser le types "prop_choro" et "prop_typo".

Dans ce cas, les choses se présentent comme ceci :

mf_map(x = africa, border = "white", lwd = 0.5)
mf_map(x = africa,
       var = c("pop","gdppc"),
       type = "prop_choro",
       nbreaks = 5,
       border = "white",
       leg_pos = c("bottomleft","topleft"),
       leg_title = c("Nombre d'habitants\nen 2020", "PIB par habitant\n(US$ courants)"),
       inches   = 0.4)

Ou bien :

mf_map(x = africa, border = "white", lwd = 0.5)
mf_map(x = africa,
       var = c("pop","region"),
       type = "prop_typo",
       nbreaks = 5,
       border = "white",
       leg_pos = c("bottomleft","topleft"),
       leg_title = c("Nombre d'habitants\nen 2020", "Régions d'appartenance"),
       inches   = 0.4)

Elements d’habillage

La package mapsf pemet d’ajouter plusieurs éléments d’habillage.

  • mf_title() permet d’ajouter un titre
  • mf_credits() permet d’afficher la source
  • mf_scale() ajoute une échelle
  • mf_arrow() ajoute une orientation.
mf_map(x = africa, border = "white", lwd = 0.5)
mf_title(txt = "Population totale")
mf_credits(txt = "Source : Banque mondiale, 2024")
mf_scale()
mf_arrow()

Tous ces éléments sont personnalisables.

mf_map(x = africa, border = "white", lwd = 0.5)
mf_title(txt = "Population totale", pos = "center", tab = FALSE, bg = "#6888ba")
mf_credits(txt = "Source : Banque mondiale, 2024", pos = "bottomright", cex = 1)
mf_scale(col = "red", scale_units = "mi", pos = "bottomleft")
mf_arrow(pos = "topright")

Astuce

Tous ces éléments peuvent être regroupés dans la fonction mf_layout()

mf_layout(
  title = "L'AfRique",
  credits = "Banque mondiale, 2024",
  arrow = TRUE, 
  scale = TRUE
)

Avec mf_shadow() vous pouvez également ajouter un ombrage.

Avec mf_graticule(), des lignes de latitude et longitude avec de belles annotations.

mf_shadow(x = africa, col = "grey50", cex = 1)
mf_graticule(
  x = africa,
  col = "coral4",
  lwd = 2,
  lty = 2,
  expandBB = c(.1, 0, 0, .1),
  label = TRUE,
  pos = c("right", "bottom"),
  cex = .8,
  add = TRUE
)
mf_map(x = africa, border = "white", lwd = 0.5, add= TRUE)

Textes et étiquettes

Vous pouvez ajouter des etiquettes avec la fonction mf_label()

mf_map(x = africa, border = "white", lwd = 0.5)
mf_label( x = africa,
  var = "name",
  col= "black",
  halo = TRUE,
  overlap = FALSE,
  lines = TRUE)

Et une simple étiquette avec mf_annotation()

mf_map(x = africa, border = "white", lwd = 0.5)
mf_annotation(
  x = africa[africa$ISO3 == "TUN", ],
  txt = "Tunisie",
  halo = TRUE,
  cex = 1.5,
  pos = "bottomleft"
)

Les thèmes

Une série de thèmes prédéfinis est disponible : "default", "brutal", "ink", "dark", "agolalight", "candy", "darkula", "iceberg", "green", "nevermind", "jsk", "barcelona".

Par exemple :

mf_theme("nevermind")
mf_map(x = africa)
mf_title(txt = "Le thème nevermind")

Le système de thèmes est très flexible. Vous pouvez prendre un thème et le modifier.

mf_theme("nevermind", tab = TRUE, bg = "green")
mf_map(x = africa)
mf_title(txt = "Le thème nevermind modifié")

Planches cartographiques

Avec R, il est aisé de construire des figures contenant plusieurs graphiques, grâce à l’argument mfrow de la fonction par().

mf_theme("default")

opar <- par(mfrow = c(1, 2))

mf_map(x = africa,
       var = "gdppc",
       type = "choro",
       border = "white",
       leg_title = "PIB par habitant\n(US$ courants)",
       inches   = 0.4)

mf_map(x = africa,
       var = "elec",
       type = "choro",
       nbreaks = 4,
       border = "white",
       pal = "Magenta",
       leg_title = "Accès à l'électricité\n(% de la pop)",
       inches   = 0.4)

par(opar)

Cartons

La fonction mf_inset_on() permet de démarrer la création d’un carton. Il faut ensuite “refermer” le carton avec mf_inset_off().

# Carte principale
mf_map(africa)

# Petite carte
tun <- africa[africa$ISO3 == "TUN", ]
mf_inset_on(x = tun, pos = "topright", cex = .1)
mf_map(tun, col = "#e69749", border = "white")
mf_scale(pos = "bottomright")
box()
mf_inset_off()
# Fin de la petite carte

mf_title("Afrique et Tunisie")

Exportez une carte

Enfin, la fonction mf_export() vous permet d’exporter vos cartes dans différents formats.

mf_export(africa, filename = "macarte.svg")
mf_map(africa, add = TRUE)
dev.off()
quartz_off_screen 
                2 

A vous de jouer

Réalisez une carte sur un indicateur de votre choix. Si besoin, vous pouvez aller chercher d’autres indicateurs grâce au package wbstats

Si vous ne l’avez pas déjà installé, tapez ceci dans la console.

install.packages('wbstats')
library(wbstats)

Par exemple

wb_search(pattern = "Bird")
# A tibble: 2 × 3
  indicator_id   indicator                  indicator_desc                      
  <chr>          <chr>                      <chr>                               
1 EN.ANM.THRD.NO Animal species, threatened Animal species are mammals (excludi…
2 EN.BIR.THRD.NO Bird species, threatened   Birds are listed for countries incl…
oiseaux_menaces <- wb_data("EN.BIR.THRD.NO", start_date = 2018, end_date = 2018)
head(oiseaux_menaces)
# A tibble: 6 × 9
  iso2c iso3c country              date EN.BIR.THRD.NO unit  obs_status footnote
  <chr> <chr> <chr>               <dbl>          <dbl> <chr> <chr>      <chr>   
1 AW    ABW   Aruba                2018              2 <NA>  <NA>       <NA>    
2 AF    AFG   Afghanistan          2018             16 <NA>  <NA>       <NA>    
3 AO    AGO   Angola               2018             32 <NA>  <NA>       <NA>    
4 AL    ALB   Albania              2018              8 <NA>  <NA>       <NA>    
5 AD    AND   Andorra              2018              3 <NA>  <NA>       <NA>    
6 AE    ARE   United Arab Emirat…  2018             13 <NA>  <NA>       <NA>    
# ℹ 1 more variable: last_updated <date>
africa_birds <-  merge(
  x = geom[,"ISO3"],  
  y = oiseaux_menaces,  
  by.x = "ISO3",
  by.y = "iso3c",
  all.x = TRUE   
)
mf_map(x = africa, border = NA, col = NA)
mf_map(x = world, border = "white", col = "#CCCCCC50", lwd = 0.5, add = TRUE)
mf_map(x = africa, border = "white", col = "#6893d9", lwd = 0.5, add = TRUE)
mf_map(x = africa_birds,
       var = "EN.BIR.THRD.NO",
       type = "prop",
       symbol = "square",
       border = "white",
       col = "#FF000080",
       leg_title = "Nombre d'oiseaux\nmenacés en 2018",
       inches   = 0.3)

3 - Cartogrammes

Il existe plusieurs méthodes pour réaliser des cartogrammes. Un certain nombre d’entre elles sont disponibles dans le package cartogram. Vous pouvez l’installer en tapant l’instruction suivante dans le console.

install.packages('cartogram')

Cartogrammes de Dorling

#library(mapsf)
library(cartogram)
pop2020_dorling <- cartogram_dorling(
  africa[!is.na(africa$pop),],
  weight = "pop",
  k=2.5
  )
mf_map(africa, col = "white", border= NA)
mf_map(pop2020_dorling, col = "#5B89A3", border= "white", add = TRUE)
mf_label(
  x = pop2020_dorling[order(pop2020_dorling$pop, decreasing = TRUE), ][1:10,],
  var = "name",
  col = "#5B89A3",
  overlap = FALSE, lines = FALSE,
  halo = TRUE,
  r = .15
)
mf_title("Population totale - Cartogramme de Dorling")

Les cartogrammes non continus

afr_ncont <- cartogram_ncont(x = africa, weight = "pop", k = 1.2)
mf_map(africa, border = "white", lwd = 0.5,)
mf_map(afr_ncont, col = "#5B89A3", border= "white", add = TRUE)
mf_title("Population en Afrique - Cartogramme de Olson")

Cartogrammes continus

africa[is.na(africa$pop),"pop"] <- 1
afr_cont <- cartogram_cont(x = africa,
                           weight = "pop",
                           itermax = 30)
mf_map(afr_cont, col = "#5B89A3", border= "white", add = FALSE)
mf_title("Population en Afrique - Cartogramme de Dougenik")
mf_inset_on(africa, cex = .2, pos = "topleft")
mf_map(africa, lwd = .5, border = "white")
mf_inset_off()

Aller plus loin

Pour en savoir plus sur les différentes formes de cartogrammes, vous pouvez aussi consulter ce document réalisé en 2021 : transcarto.github.io/rcartograms/TRANSCARTO_cartograms.html

4 - Cartographie Interactive

Le langage R permet d’embarquer des librairies en JavaScript dans des packages. Cela ouvre la possibilité de réaliser des proposer des outils de cartographie interactive. Ici, nous parlerons de 2 exemples principaux.

mapview

Le package mapview permet de créer rapidement et facilement des visualisations interactives de données spatiales avec ou sans fond de carte. Le package s’installe de la façon suivante :

install.packages('mapview')
library(sf)
library(mapview)
mapview(africa) + mapview(st_centroid(africa))

Leaflet

Leaflet est un package basé sur le JavaScript, permettant de faire de la cartographie interactive. On l’installe de la façon suivante :

install.packages('leaflet')
library(leaflet)

Réalisation d’une première carte simple

m = leaflet() %>% addTiles()
m

Zoom sur une localisation précise.

sfax <- c(10.760034694759957, 34.7407779744004)
m2 <- leaflet() %>% setView(lng = sfax[1], lat = sfax[2], zoom = 12) %>% 
  addTiles() 
m2

Ajout de géométries

africa_wgs84 <- st_transform(africa, 4326)
popup <- paste0("<b>",africa_wgs84$name,"</b><br/><b>Population: </b>", 
                africa_wgs84$pop)
m3 = leaflet() %>% 
  addTiles() %>% 
  addPolygons(data=africa_wgs84, weight = 2, fillColor = "yellow", popup= popup) %>%         
  addMarkers(data = st_centroid(africa_wgs84)) %>%  addMiniMap(position = "bottomright")
Warning: st_centroid assumes attributes are constant over geometries
m3

Au delà de R

Avec Quarto et Observable JavaScript, il est également possible de créer des cartes thématiques interactives dans Rstudio.