Module Cartographie
20/02/2025
Ce diaporama de formation a été rédigé dans le but d’être le support visuel des formations dispensées au MASA.
Ces formations s’adressent à des agents qui ont suivi la formation R initialisation.
Elles sont données en présentiel sur une durée de trois journée, les modules de cette formation sont ajustables suivants le choix des agents.
Champ couvert par cette formation
Ce support couvre le module cartographie dans l’environnement du Minsitère.
Pour information, Les Modules de la formation R-perfectionnement sont:
01 - Module Rappels
02 - Module Fonctions
03 - Module Quarto
04 - Module Création de graphiques avec ggplot2
05 - Module Cartes statiques et interactives
06 - Module Parquet
07 - Module Initiation à l’écriture d’applications Shiny
Ils sont orientés pour être utile aux agents du SSM MASA et se concentrent sur une utilisation de R via RStudio qui est mise à disposition des agents sur la plateforme interne Cerise basée sur RStudio Workbench.
Les packages utilisés dans ce module sont :
Autres possibilités pour la carto avec : {ggplot2} + {ggspatial}, {mapsf}, {leaflet} ou {mapview},…
Les différentes étapes de la réalisation d’une carte :
Objectif : carte départementale métropolitaine des parts d’exploitations ayant au moins une parcelle conduite en agriculture biologique et du nombre d’exploitations (source : RA 2020)
La fonction read_sf()
permet d’ouvrir des fonds carto au format .TAB (mapinfo), .shp (shapefile), *.gpkg (geopackage) et bien d’autres (PostGIS).
gpkg <- "~/CERISE/03-Espace-de-Diffusion/000_Referentiels/0040_Geo/IGN/adminexpress/adminexpress_cog_simpl_000_2023.gpkg"
st_layers(gpkg)
dep <- read_sf(gpkg, layer = "departement") |>
filter(insee_reg > "06") |>
st_transform("EPSG:2154")
L’objet combine des polygones (le contour des départements ici) et des données regroupées dans un objet de type data.frame.
Ce data.frame se comporte comme n’importe quel autre (même utilisation des fonctions str()
, names()
…).
plot()
permet d’afficher le fond spatial pour toutes les variables dans la fenêtre graphique.
exp_dep <- read_rds("~/CERISE/03-Espace-de-Diffusion/030_Structures_exploitations/3020_Recensements/RA_2020/01_BASES DIFFUSION RA2020/DEF_240112/RA2020_EXPLOITATIONS_240112.rds") |>
as_tibble(.name_repair = make_clean_names) |>
filter(champ_geo == "1") |>
group_by(siege_dep) |>
summarise(n_exp = n(),
n_exp_bio = sum(bio_fil, na.rm = TRUE)) |>
mutate(part_exp_bio = n_exp_bio / n_exp * 100)
head(exp_dep)
bio <- dep %>%
left_join(exp_dep, by = c("insee_dep" = "siege_dep"))
tmap_mode("view")
tm_shape(bio) +
tm_polygons("part_exp_bio",
style = "pretty",
n = 5,
title = "part en %",
palette = "BuGn",
border.col = "grey30",
lwd = 0.25,
legend.reverse = TRUE,
legend.format = list(text.separator = " - "))
tmap_mode("plot")
tm_shape(bio) +
tm_borders(col = "grey30",
lwd = 0.25) +
tm_symbols(size = "n_exp",
col = "darkolivegreen4",
title.size = "Nombre d'exploitations")
tm_shape(bio) +
tm_polygons(
"part_exp_bio",
style = "pretty",
n = 5,
title = "part en %",
palette = "BuGn",
border.col = "grey30",
lwd = 0.25,
legend.reverse = TRUE,
legend.format = list(text.separator = " - ")) +
tm_symbols(size = "n_exp",
col = "darkolivegreen4",
title.size = "nombre d'exploitations")
Une alternative consiste à faire varier la taille + la couleur du cercle : les couleurs des classes de la variable représentée en aplats sont placées dans les ronds proportionnels
m <- tm_shape(bio) +
tm_borders(col = "grey30",
lwd = 0.25,) +
tm_symbols(size = "n_exp",
col = "part_exp_bio",
palette = "BuGn",
title.col = "part (%)",
title.size = "nombre\nd'exploitations",
legend.format = list(fun = \(x) format(x, big.mark = " "),
text.separator = " - "),
legend.col.reverse = TRUE,
legend.size.is.portrait = TRUE)
Les couleurs sont à préciser dans l’argument palette de la fonction tm_polygons()
. Il faut autant de couleurs qu’il y a de classes.
Lien utile : Colors in R. Ce document présente l’ensemble des couleurs disponibles sous R
La fonction tmaptools::palette_explorer()
permet de visualiser des palettes de couleurs
{.' .r} str(brewer.pal.info)
L’argument style de la fonction tm_polygons() peut recevoir les valeurs suivantes : “cat”, “fixed”, “sd”, “equal”, “pretty”, “quantile”, “kmeans”, “hclust”, “bclust”, “fisher” etc. et l’argument n reçoit le nombre de classes à construire
#| code-fold: true
#| results: hide
#| output: false
tmap_mode("plot")
library(classInt)
library(patchwork)
n_classes <- 5
methodes <- c("sd", "equal", "pretty", "quantile", "kmeans", "hclust", "bclust",
"fisher", "jenks", "dpih", "headtails")
generer <- function(methode) {
cesures <- classIntervals(bio$part_exp_bio, style = methode, n = n_classes)
palette <- viridisLite::viridis(length(cesures$brks) - 1)
carte <- tm_shape(bio) +
tm_polygons("part_exp_bio",
style = "fixed",
breaks = cesures$brks,
title = "%",
palette = palette,
border.col = "grey30",
lwd = 0.25,
legend.reverse = TRUE,
legend.format = list(text.separator = " - ")) +
tm_layout(frame = FALSE,
bg.color = NA,
legend.outside = TRUE,
legend.outside.position = "bottom")
graphique <- density(bio$part_exp_bio)[c("x", "y")] |>
as_tibble() |>
mutate(intervalle = findInterval(x, cesures$brks)) |>
filter(between(intervalle, 1, length(cesures$brks) - 1)) |>
mutate(couleur = palette[intervalle]) |>
ggplot(aes(x, y)) +
geom_area(aes(fill = couleur)) +
geom_line() +
scale_fill_identity() +
labs(title = methode,
x = "part des exploitations en bio (%)",
y = "densité") +
theme_minimal()
out <- tmap_grob(carte)
return(graphique + out)
}
exemples_classes <- methodes |>
map(generer)
Il est possible de renseigner ses propres classes dans l’argument breaks
de la fonction tm_polygons()
. Pour renseigner un découpage en n classes, l’argument doit contenir un vecteur de taille n+1 : c(min, borne₁, borne₂, … , borneₙ₋₁, max)
.
Exemple - La méthode quantile à 5 classes donne les ruptures suivantes : {2.085026 ; 4.880998 ; 6.820057 ; 9.213732 ; 13.183048 ; 50.000000}. Pour avoir des valeurs arrondies , je peux renseigner breaks = c(2, 5, 7, 9, 13, 50)
dans la fonction.
tmap_mode("plot")
m <- tm_shape(bio) +
tm_polygons("part_exp_bio",
style = "pretty",
n = 5,
title = "part en %",
palette = "BuGn",
border.col = "grey30",
lwd = 0.25,
legend.reverse = TRUE,
legend.format = list(text.separator = " - ")) +
tm_text("insee_dep",
size = 0.5,
remove.overlap = TRUE) +
tm_layout("Exploitations\nen conduite bio",
scale = .8,
legend.position = c("left", "center"),
fontfamily = "Marianne") +
tm_credits(paste0("données Agreste RA 2020\nfond carto. d'après IGN AdminExpress 2023\n",
Sys.Date()),
size = 0.5,
position = c(0.2, 0.01)) +
tm_scale_bar(color.dark = "grey40",
width = 0.2,
position = c(0.45, 0.01)) +
tm_compass(type = "rose",
position = c(0.7, 0.01),
size = 1.5) +
tm_logo("logo_masa.png",
position = c("left", "bottom"),
height = 3)
m
tmap_save(m, "pcent_bio_fr.png",
width = 20, units = "cm", asp = 1.618,
dpi = 300,
device = agg_png)
# ou pour une carte interactive :
#
# tmap_mode("view")
# tmap_save(m, "pcent_bio_fr.html")
tmap_mode("plot")
tm_shape(bio) +
tm_polygons("part_exp_bio",
style = "pretty",
n = 5,
title = "part en %",
palette = "BuGn",
border.col = "grey30",
lwd = 0.25,
legend.reverse = TRUE,
legend.format = list(text.separator = " - ")) +
tm_facets("insee_reg") +
tm_layout("Exploitations\nen conduite bio\npar région")
Crameri, Fabio, Grace E. Shephard, et Philip J. Heron. 2020. « The Misuse of Colour in Science Communication ». Nature Communications 11 (1): 5444. https://doi.org/10.1038/s41467-020-19160-7.
Engelaere-Lefebvre, Juliette, Maël Theulière, et Jean-Daniel Lomenède. 2023. « Analyses spatiales avec R ». Formations R aux MTES & MCTRCT. https://mtes-mct.github.io/parcours_r_module_analyse_spatiale/
Harrower, Mark, et Cynthia A. Brewer. 2003. « ColorBrewer. Org: An Online Tool for Selecting Colour Schemes for Maps ». The Cartographic Journal 40 (1): 27‑37. https://doi.org/10.1179/000870403235002042.
Loonis, Vincent, et Marie-Pierre de Bellefon. 2018. Manuel d’analyse spatiale. Théorie et mise en œuvre pratique avec R. Insee Méthodes 131. Montrouge: INSEE - Eurostat. https://www.insee.fr/fr/information/3635442.
Lovelace, Robin, Jakub Nowosad, et Jannes Muenchow. 2023. Geocomputation with R. https://r.geocompx.org/.
Pebesma, Edzer, et Roger Bivand. 2023. Spatial Data Science: With Applications in R. New York: Chapman and Hall/CRC. https://doi.org/10.1201/9780429459016.
Rowe, Francisco, et Dani Arribas-Bel. 2022. Spatial Modelling for Data Scientists. University of Liverpool. https://gdsl-ul.github.io/san/.
Theulière, Maël. 2019. « Les données spatiales avec R ». https://maeltheuliere.github.io/rspatial/index.html.
Wimberly, Michael C. 2023. Geographic Data Science with R: Visualizing and Analyzing Environmental Change. https://bookdown.org/mcwimberly/gdswr-book/.
Zeileis, Achim, Kurt Hornik, et Paul Murrell. 2009. « Escaping RGBland: Selecting Colors for Statistical Graphics ». Research {{Report Series}} 61. Vienna: Department of Statistics and Mathematics, WU Vienna University of Economics and Business. http://www.sciencedirect.com/science/article/pii/S0167947308005549.
Zeileis, Achim, et Paul Murrell. 2023. « Coloring in R’s Blind Spot ». The R Journal 15 (3): 240‑56. https://doi.org/10.32614/RJ-2023-071.
Réaliser la carte de densité de population communale du département de l’Aisne.
Le fichier de données est le fichier popD02_2013.rds . Le fond de carte est le fichier ComD02.TAB.
#| code-fold: true
com <- read_sf("donnees_exercices/ComD02.TAB") |>
clean_names()
pop <- read_rds("donnees_exercices/popD02_2013.rds") |>
as_tibble(.name_repair = make_clean_names)
com_pop <- com |>
select(-libgeo, -surf) |>
left_join(pop, join_by(codgeo)) |>
mutate(dpop_habkm2 = pop13 / surf,
evol_pop_pcent = (pop13 - pop08) / pop08 * 100)
#| code-fold: true
com_pop |>
tm_shape() +
tm_polygons("dpop_habkm2",
style = "kmeans",
legend.reverse = TRUE,
palette = "viridis")
Réaliser la carte d’évolution de la population communale du département de l’Aisne. On différenciera les évolutions positives et les évolutions négatives.
Le fichier de données et le fond de carte sont les mêmes que pour l’exercice précédent.
Reprendre la carte précédente en construisant des classes manuelles.
#| code-fold: true
com_pop |>
tm_shape() +
tm_polygons("evol_pop_pcent",
breaks = c(-20, -10, -5, 5, 10, 20),
midpoint = 0,
legend.reverse = TRUE)
Reprendre la carte précédente en personnalisant les couleurs.
#| code-fold: true
com_pop |>
tm_shape() +
tm_polygons("evol_pop_pcent",
style = "fixed",
breaks = c(-20, -10, -5, 5, 10, 20),
legend.reverse = TRUE,
midpoint = 0,
palette = "PRGn")
pour inverser la palette : "-PRGn"
Habiller la carte construite au fil des exercices précédents.
#| code-fold: true
villes <- com_pop |>
filter(pop13 > 10000)
m <- com_pop |>
tm_shape() +
tm_polygons("evol_pop_pcent",
title = "variation\nhabitants (%)",
style = "fixed",
breaks = c(-Inf, -20, -10, -5, 5, 10, 20, Inf),
legend.reverse = TRUE,
midpoint = 0,
legend.format = list(text.separator = "à",
text.less.than = "moins de",
text.or.more = "ou plus"),
palette = "PRGn") +
tm_shape(villes) +
tm_symbols(size = 0.1,
col = "black") +
tm_text("libgeo",
size = 0.5,
just = -0.1,
shadow = TRUE, ) +
tm_layout(main.title = "Évolution de la population - Aisne 2008-2013",
main.title.size = 0.9,
scale = .8,
legend.position = c(0.7, 0.15),
fontfamily = "Marianne") +
tm_credits(paste0("données INSEE RP 2020\nfond carto. d'après IGN\n",
Sys.Date()),
size = 0.5,
position = c(0.6, 0.05)) +
tm_scale_bar(color.dark = "grey40",
width = 0.2,
position = c(0.6, 0.01)) +
tm_compass(type = "rose",
position = c(0.9, 0.01),
size = 1.5) +
tm_logo("logo_masa.png", margin = 0,
position = c("left", "bottom"),
height = 3)
m
Exporter la carte au format PDF.
#| code-fold: true
tmap_save(m, "population_002_2008-2013.pdf",
width = 20, height = 28.7, units = "cm",
dpi = 300,
device = cairo_pdf)