Dessiner des cartes choroplèthes et des cartes de points avec geom_sf() — le workflow spatial moderne
Data Visualization
Apprenez à créer des cartes en R avec ggplot2 et le package sf — lire des données spatiales, dessiner les polygones des régions avec geom_sf(), remplir une carte choroplèthe selon une variable, ajouter des points et définir une projection cartographique. Le remplaçant moderne de l’ancienne approche maps/ggmap — chaque carte est rendue à partir de vrai code R, prêt à copier-coller.
Comment lire des données spatiales dans R avec sf::st_read() — aucune manipulation de shapefile, juste une fonction.
Dessiner les polygones des régions avec geom_sf() — ggplot2 lit automatiquement la colonne geometry.
Transformer une carte simple en carte choroplèthe en associant une variable à aes(fill = ...).
Ajouter des points (villes, sites, centres de comtés) par-dessus les polygones.
Reprojeter à la volée avec coord_sf(crs = ...) — choisissez une projection adaptée à votre région.
Chaque carte est rendue à partir de vrai code R que vous pouvez copier et exécuter — il vous suffit de sf et ggplot2, et les données sont fournies avec sf (aucun téléchargement).
Créer une carte en R signifiait autrefois jongler avec maps, fortify() et un package de tuiles Google comme ggmap pour un fond raster. Ce workflow est désormais obsolète. La méthode moderne est une pile unique et cohérente : le package sf stocke votre géographie sous forme d’un data frame ordinaire doté d’une colonne geometry, et ggplot2 la dessine avec un seul geom — geom_sf(). Lire, remplir, superposer, projeter — le tout dans la grammaire des graphiques que vous connaissez déjà.
Pour que ce billet soit autonome, nous utilisons le shapefile des comtés de Caroline du Nord fourni à l’intérieur du package sf, si bien que rien n’a besoin d’être téléchargé. Il contient 100 comtés et, pour chacun, le nombre de naissances et de cas de SIDS (mort subite du nourrisson) enregistrés en 1974 et 1979 — parfait pour une carte choroplèthe.
Lire des données spatiales avec sf
Pointez st_read() vers un shapefile et vous récupérez un objet sf : un data frame ordinaire où chaque ligne est une entité (ici, un comté) et où la dernière colonne, geometry, contient le polygone de cette entité. system.file() résout le chemin vers la copie intégrée au package sf, si bien que cela fonctionne sur n’importe quelle machine :
Lisez cette sortie comme n’importe quel data frame — mais remarquez l’en-tête au-dessus du tableau : il indique le type de géométrie (MULTIPOLYGON), la bounding box et le CRS (système de référence des coordonnées), NAD27 — longitude/latitude géographiques. La colonne geometry accompagne les attributs à travers chaque opération sf, si bien que vous ne gérez jamais les coordonnées à la main. Les colonnes qui nous intéressent sont NAME (comté), BIR74 (naissances vivantes, 1974) et SID74 (cas de SIDS, 1974).
Dessiner les polygones des régions avec geom_sf()
geom_sf() fait tout le travail. Passez-lui un objet sf et il trouve la colonne geometry, choisit le bon tracé (ici des polygones) et définit pour vous un système de coordonnées à échelle égale — pas de coord_fixed(), pas de calcul de rapport d’aspect. Voici le simple contour des 100 comtés :
Voilà une carte complète et correctement proportionnée à partir de trois lignes de code de tracé. fill définit la couleur des polygones, color celle des bordures, et theme_minimal() la garde épurée. Pour supprimer le graticule (les lignes de la grille lon/lat) et obtenir un rendu plus plat, passez plutôt à theme_void().
Créer une carte choroplèthe : remplir selon une variable
Une carte choroplèthe teinte chaque région selon une valeur. Comme un objet sf n’est qu’un data frame, vous associez une colonne à fill exactement comme vous le feriez pour un diagramme en barres — aes(fill = BIR74) — et geom_sf() colore le polygone de chaque comté selon son nombre de naissances de 1974. Utilisez une échelle viridis séquentielle (scale_fill_viridis_c()) : elle est perceptuellement uniforme et adaptée au daltonisme, le bon choix par défaut pour une quantité continue.
library(sf)library(ggplot2)nc <-st_read(system.file("shape/nc.shp", package ="sf"), quiet =TRUE)ggplot(nc) +geom_sf(aes(fill = BIR74), color ="white", linewidth =0.15) +scale_fill_viridis_c(option ="viridis", name ="Births (1974)") +labs(title ="Live births by county, North Carolina 1974") +theme_minimal()
La carte raconte maintenant une histoire : la plupart des comtés s’affichent en violet foncé (de quelques centaines à quelques milliers de naissances), et une poignée brille en jaune vif — les centres de population de l’État. Le comté le plus lumineux est Mecklenburg (Charlotte), avec bien plus de naissances que n’importe quel comté rural. C’est la carte choroplèthe qui fait son travail : elle transforme d’un coup d’œil une colonne de chiffres en géographie. Pour un taux plutôt qu’un effectif brut, vous calculeriez d’abord SID74 / BIR74 et rempliriez selon ce taux — préférez toujours un taux quand les régions diffèrent en population.
Ajouter des points à votre carte
Les vraies cartes superposent des marques par-dessus la géographie de base — villes, sites d’échantillonnage, capitales. Dans sf, un ensemble de points n’est qu’un autre objet sf, et vous l’ajoutez avec un second geom_sf(). Pour le démontrer sans données supplémentaires, nous calculons le centroïde de chaque comté avec st_centroid() et dimensionnons le point selon son nombre de SIDS. Comme les deux couches portent un CRS, ggplot2 les aligne automatiquement :
library(sf)library(ggplot2)nc <-st_read(system.file("shape/nc.shp", package ="sf"), quiet =TRUE)centres <-st_centroid(nc)ggplot() +geom_sf(data = nc, fill ="#eaf1fb", color ="grey60", linewidth =0.15) +geom_sf(data = centres, aes(size = SID74), color ="#3a86d4", alpha =0.7) +scale_size_area(max_size =8, name ="SIDS (1974)") +labs(title ="County centres sized by 1974 SIDS count") +theme_minimal()
Chaque point se situe au centre géométrique d’un comté, et son aire encode le nombre de SIDS — scale_size_area() associe la valeur à l’aire (et non au rayon), le choix honnête pour des points dimensionnés. L’argument data = de chaque geom_sf() permet aux polygones de base et aux points de provenir d’objets différents, la façon standard de construire une carte en couches. Remplacez centres par vos propres points — lisez-les avec st_as_sf(df, coords = c("lon", "lat"), crs = 4326) et le même appel les dessine.
Définir une projection cartographique
Toute carte aplatit une Terre courbe, et la façon dont elle l’aplatit, c’est la projection. Les données de Caroline du Nord arrivent en coordonnées géographiques (longitude/latitude, NAD27) — parfait pour un aperçu rapide, mais les degrés de longitude rétrécissent à mesure que l’on s’éloigne de l’équateur, si bien que les formes et les aires sont subtilement déformées. Reprojetez à la volée avec coord_sf(crs = ...) : cela transforme l’affichage sans toucher à vos données. Ici, nous passons à US Albers équivalente (EPSG 5070), une projection conçue pour préserver les aires — le bon choix quand vous comparez les tailles des régions :
library(sf)library(ggplot2)nc <-st_read(system.file("shape/nc.shp", package ="sf"), quiet =TRUE)ggplot(nc) +geom_sf(aes(fill = BIR74), color ="white", linewidth =0.15) +scale_fill_viridis_c(name ="Births (1974)") +coord_sf(crs =5070) +labs(title ="North Carolina in an equal-area projection (EPSG:5070)") +theme_minimal()
Comparez-la avec la carte choroplèthe précédente : l’État se courbe désormais légèrement, reflétant une vue projetée, fidèle aux aires, plutôt qu’une grille lon/lat plate. coord_sf() est la voie purement visuelle — elle reprojette seulement pour le graphique. Pour reprojeter les données elles-mêmes (par exemple avant une jointure spatiale), utilisez plutôt st_transform(nc, 5070). Dans les deux cas, il vous faut un code EPSG ; sf::st_crs(3857) (Mercator web) et 5070 (US Albers) couvrent la plupart des besoins, et un code régional State Plane est le plus précis pour un seul État.
Foire aux questions
NoteAi-je encore besoin de ggmap, maps ou fortify() pour faire des cartes en R ?
Non. L’ancien workflow — maps ou un shapefile téléchargé, fortify() vers un data frame et ggmap pour un fond raster — est supplanté. Stockez la géographie sous forme d’objet sf et dessinez-la avec geom_sf(). Vous ne recourez à un package de tuiles que lorsque vous voulez spécifiquement un fond photographique satellite/rue ; pour les polygones, les points et les cartes choroplèthes, sf + ggplot2 est le standard moderne.
NoteComment tracer mes propres points longitude/latitude sur une carte ?
Transformez votre data frame en objet sf avec st_as_sf(df, coords = c("lon", "lat"), crs = 4326) — crs = 4326 indique que les coordonnées sont en lon/lat WGS84 (ce que fournissent le GPS et la plupart des API). Ajoutez-le ensuite comme deuxième couche : geom_sf(data = my_points). ggplot2 l’aligne automatiquement avec vos polygones de base tant que les deux portent un CRS.
NoteComment créer une carte choroplèthe (remplir les régions selon une valeur) ?
Associez une colonne à fill dans geom_sf() : geom_sf(aes(fill = my_variable)), puis ajoutez une échelle continue comme scale_fill_viridis_c(). Comme un objet sf est un data frame, c’est identique au remplissage des barres d’un diagramme en barres. Pour une comparaison équitable entre des régions de population différente, remplissez selon un taux (par exemple deaths / population) plutôt qu’un effectif brut.
NoteQuelle projection utiliser, et comment la définir ?
Utilisez coord_sf(crs = <EPSG code>) pour reprojeter l’affichage sans modifier vos données. Pour comparer des aires, choisissez une projection équivalente (US Albers est EPSG 5070) ; Mercator web est 3857 ; un code régional State Plane est le meilleur pour un seul État ou une seule ville. Pour transformer la géométrie sous-jacente (avant une opération spatiale), utilisez plutôt st_transform(data, <EPSG>).
NotePourquoi geom_sf() sait-il dessiner mes données sans attributs esthétiques x et y ?
geom_sf() lit directement la colonne geometry d’un objet sf — il détecte si chaque entité est un point, une ligne ou un polygone et la dessine en conséquence, et il définit un système de coordonnées à échelle égale pour que la carte ne soit pas étirée. C’est pourquoi vous ne passez jamais aes(x = , y = ) pour la géométrie ; vous ne faites qu’associer des attributs esthétiques supplémentaires comme fill, color ou size aux colonnes d’attributs.
Pour aller plus loin dans /learn
Ce billet est la recette cartographique ciblée. Pour la base complète de la grammaire des graphiques derrière geom_sf() — échelles, thèmes, légendes et superposition — consultez les leçons pas à pas, validées par la reproductibilité :
ggplot2 en R — la série complète : attributs esthétiques, geoms, échelles et thèmes.
Visualisation de données — tout le pilier, du premier graphique aux figures de qualité publication.
Demandez à Prova« dessine une carte choroplèthe de mon shapefile de région avec sf et geom_sf, remplie selon un taux » — elle répond avec du code que vous pouvez exécuter sur vos propres données spatiales. The runtime is the judge.Demander à Prova →
Cette page vous a-t-elle été utile ?
Merci pour votre retour !
Recevez les nouvelles leçons R & Python par e-mail
Pratique, reproductible, sans spam. Désinscription à tout moment.
Double opt-in. Nous ne partageons jamais votre e-mail.
@online{kassambara2026,
author = {Kassambara, Alboukadel},
title = {Créer des cartes en R avec ggplot2 et sf},
date = {2026-07-08},
url = {https://www.datanovia.com/blog/maps-in-r-with-ggplot2-sf},
langid = {fr}
}