Voici quelques lignes de code pour vous accompagner à réaliser simplement une première carte à partir de données disponibles sur une plateforme de données.
J’ai choisi de ne traiter ici que des données vectorielles (pas d’images ou raster). Toutes les données sont disponibles sur le portail open data de Montpellier Méditerranée Métropole (MMM: https://data.montpellier3m.fr/)
Pour cette brève présentation, vous aurez besoin des librariries {sf}
et {tmap}
, sans oublier l’incontournable {tidyverse}
.
Il faut distinguer la manipulation des données de la visualisation des données.
Le package {sf}
(Spatial Feature) est dédié à la manipulation, la transformation et l’analyse de données spatiales. A la manière du Tidyverse, il combine les fonctionnalités de {sp}
, {rgeos}
et {rgdal}
dans un package.
Le package {tmap}
(thematic map) est quant à lui dédié à la visualisation des données spatiales. Cette fois-ci, à la manière du package {ggplot2}
.
.
library(tidyverse)
library(sf)
library(tmap)
Les données brutes peuvent avoir de multiples formats:
Nous utiliserons la fonction st_read()
du package {sf}
. Les données des exemples sont disponibles sur la plateforme open data de MMM. Vous pouvez bien sûr remplacer le chemin (l’url) par le chemin de données sur votre machine!
OSM_MMM_BNAC <- read_sf("https://data.montpellier3m.fr/sites/default/files/ressources/OSM_MMM_BNAC.geojson")
class(OSM_MMM_BNAC)
## [1] "sf" "tbl_df" "tbl" "data.frame"
Les données spatiales dans R sont de classe sf. Mais on constate aussi qu’elles sont de classes tbl_df, tbl et data.frame. Des classes d’objets que l’on connait bien et que nous manipulons au quotidien 🙂
Les fonctions du tidyverse permettent de manipuler les tables.
code_commune_select <- "34172" #Montpellier
OSM_MMM_BNAC %>%
filter(code_com_g==code_commune_select,ame_d=="VOIE VERTE")
## Simple feature collection with 113 features and 30 fields
## Geometry type: LINESTRING
## Dimension: XY
## Bounding box: xmin: 3.818371 ymin: 43.58251 xmax: 3.930179 ymax: 43.64231
## Geodetic CRS: WGS 84
## # A tibble: 113 × 31
## id_local resea…¹ nom_loc id_osm num_iti code_…² ame_d regim…³ sens_d large…⁴
## * <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
## 1 id_loc33… "" "" way/3… "" 34172 VOIE… "" BIDIR… ""
## 2 id_loc10… "" "" way/1… "" 34172 VOIE… "" BIDIR… ""
## 3 id_loc69… "" "" way/6… "" 34172 VOIE… "" BIDIR… ""
## 4 id_loc37… "" "" way/3… "" 34172 VOIE… "AIRE … BIDIR… ""
## 5 id_loc55… "" "" way/5… "" 34172 VOIE… "AIRE … BIDIR… ""
## 6 id_loc55… "" "" way/5… "" 34172 VOIE… "AIRE … BIDIR… ""
## 7 id_loc24… "" "" way/2… "" 34172 VOIE… "AIRE … BIDIR… ""
## 8 id_loc50… "" "" way/5… "" 34172 VOIE… "" BIDIR… ""
## 9 id_loc46… "" "" way/4… "" 34172 VOIE… "" BIDIR… ""
## 10 id_loc25… "" "" way/2… "" 34172 VOIE… "" BIDIR… ""
## # … with 103 more rows, 21 more variables: local_d <chr>, statut_d <chr>,
## # revet_d <chr>, code_com_g <chr>, ame_g <chr>, regime_g <chr>, sens_g <chr>,
## # largeur_g <chr>, local_g <chr>, statut_g <chr>, revet_g <chr>,
## # access_ame <chr>, date_maj <date>, trafic_vit <chr>, lumiere <chr>,
## # d_service <chr>, comm <chr>, source <chr>, project_c <chr>, ref_geo <chr>,
## # geometry <LINESTRING [°]>, and abbreviated variable names ¹reseau_loc,
## # ²code_com_d, ³regime_d, ⁴largeur_d
On constate qu’il y a systématiquement une colonne nommée geometry dans nos tables. Cette colonne geometry contient les coordonnées géographiques des individus (lignes). Pour faire simple, elles peuvent être :
Il suffit d’utiliser la fonction summarise()
du package dplyr
.
OSM_MMM_BNAC %>%
filter(code_com_g==code_commune_select,ame_d=="VOIE VERTE") %>%
summarise()
## Simple feature collection with 1 feature and 0 fields
## Geometry type: MULTILINESTRING
## Dimension: XY
## Bounding box: xmin: 3.818371 ymin: 43.58251 xmax: 3.930179 ymax: 43.64231
## Geodetic CRS: WGS 84
## # A tibble: 1 × 1
## geometry
## <MULTILINESTRING [°]>
## 1 ((3.842989 43.64178, 3.841227 43.64231, 3.841114 43.64231, 3.840252 43.64189,…
Si on souhaite traiter la table comme une table classique (regrouper sur des caractéristiques), il suffit d’utiliser la fonction as_tibble
du package dplyr
.
OSM_MMM_BNAC %>%
as_tibble() %>%
group_by(ame_d) %>%
summarise(nb=n())
## # A tibble: 8 × 2
## ame_d nb
## <chr> <int>
## 1 AMENAGEMENT MIXTE PIETON VELO HORS VOIE VERTE 941
## 2 AUCUN 52
## 3 AUTRE 177
## 4 BANDE CYCLABLE 315
## 5 COULOIR BUS+VELO 119
## 6 PISTE CYCLABLE 1174
## 7 RAMPE 5
## 8 VOIE VERTE 241
On peut extraire des informations des géométries:
st_length()
du package {sf}
st_area()
du package {sf}
OSM_MMM_BNAC %>%
mutate(longueur=st_length(geometry)) %>%
as_tibble() %>%
group_by(ame_d) %>%
summarise(longueur=sum(longueur))
## # A tibble: 8 × 2
## ame_d longueur
## <chr> [m]
## 1 AMENAGEMENT MIXTE PIETON VELO HORS VOIE VERTE 87604.
## 2 AUCUN 8914.
## 3 AUTRE 23746.
## 4 BANDE CYCLABLE 37544.
## 5 COULOIR BUS+VELO 19027.
## 6 PISTE CYCLABLE 242654.
## 7 RAMPE 24.9
## 8 VOIE VERTE 52839.
Au fil du temps, j’ai choisi le package {tmap}
car il répond parfaitement à mon besoin de faire des cartes rapidement et plutôt jolies. Il a la même logique que ggplot2 (qui permet aussi de faire des cartes), couvre un large spectre de types de données spatiales et, c’est peut-être pour moi l’essentiel, me permet de réaliser avec le même code des cartes interactives ou statiques.
Pour cette première carte, nous allons afficher l’ensemble des aménagements cyclables de MMM. Il s’agit donc de lignes. On initialise toujours une carte dans un premier temps avec la fonction tm_shape()
(un peut comme ggplot) puis on appelle la fonction appropriée aux géométries. Ici on appelle tm_lines()
.
carte1 <- tm_shape(OSM_MMM_BNAC)+
tm_lines(col="#246D5F")
carte1
En fonction du type de géométries, on choisira (pour faire simple) la fonction adaptée:
tm_dots()
, tm_bubbles()
, tm_symbols()
, tm_markers()
les pointstm_lines()
pour les lignestm_borders()
, tm_fill()
, tm_polygons()
pour les polygonescarte1 +
tm_layout(title= 'Aménagements cyclables de Montpellier Méditerranée Métropole')
Les cartographes aiment qu’on leur rappelle le nord. Pas de problèmes avec la fonction tm_compass
:
carte1 +
tm_compass()
Afficher la source des données fait partie des bonnes pratiques aussi. Là encore, on assure le coup avec tm_credits()
🙂
carte1 +
tm_credits("Source: Montpellier Mediterranée Métropole")
Vous pourrez superposer plusieurs cartes sans problème. Attention, il faudra vous assurer au préalable qu’elles aient la même projection avec st_crs()
.
# Contours des communes de Montpellier Méditerranée Métropole
# https://data.montpellier3m.fr/dataset/contours-des-communes-de-montpellier-mediterranee-metropole
Contours_communes_MMM <- read_sf("https://data.montpellier3m.fr/sites/default/files/ressources/MMM_MMM_Limites.geojson")
# Contours de Montpellier Méditerranée Métropole
# https://data.montpellier3m.fr/dataset/contours-de-montpellier-mediterranee-metropole
Contours_MMM <- read_sf("https://data.montpellier3m.fr/sites/default/files/ressources/MMM_MMM_Contours.geojson")
st_crs(OSM_MMM_BNAC)==st_crs(Contours_communes_MMM)
## [1] TRUE
Si elles n’ont pas la même projection, vous pourres toujours utiliser st_transform()
.
carte2 <- tm_shape(Contours_communes_MMM)+
tm_polygons(col = "grey",border.col = "white")+
tm_shape(Contours_MMM)+
tm_borders(col = "#666666",lwd=3)
carte2+
carte1+
tm_layout(main.title ='Aménagements cyclables de Montpellier Méditerranée Métropole',
main.title.size=1,
inner.margins=0.1)+
tm_credits("Source: Montpellier Mediterranée Métropole",position = c(0,0))+
tm_compass()
En remplacant, le paramètre col qui jusque là contenait une valeur hexadécimale correspondant à un splendide vert, vous associerez alors une couleur à une modalité. Comme ici, où la variable ame_d de la table OSM_MMM_BNAC qualifie chaque type d’aménagement cyclable:
carte3 <- tm_shape(OSM_MMM_BNAC)+
tm_lines(col="ame_d")
carte2+
carte3+
tm_layout(title ='Aménagements cyclables de Montpellier Méditerranée Métropole')+
tm_credits("Source: Montpellier Mediterranée Métropole",position = c(0,0))+
tm_compass()
La même carte avec une petite mise en forme…
carte3 <- tm_shape(OSM_MMM_BNAC %>%
mutate(ame_d=str_trunc(ame_d,15,side="right",ellipsis="..."))
)+
tm_lines(col="ame_d",title.col = "Type\nd'aménagement",
palette="viridis")
carte2+
carte3+
tm_layout(main.title ='Aménagements cyclables de Montpellier Méditerranée Métropole',
main.title.size=1,
inner.margins=0.1,
legend.outside = T,
legend.text.size=0.4)+
tm_credits("Source: Montpellier Mediterranée Métropole",position = c(0,0))+
tm_compass()
Comme sur ggplot2, on a la possibilité de réaliser des facettes. C’est parfois utile:
carte2+
carte1+
tm_layout(title= 'Aménagements cyclables de Montpellier Méditerranée Métropole',)+
tm_credits("Source: Montpellier Mediterranée Métropole",position = c(0,0))+
tm_compass()+
tm_facets("ame_d",free.coords = F)
leaflet est une librairie javascript qui permet de réaliser des cartes interactives: https://leafletjs.com/
Cette librairie est à l’origine du package {leaflet}
qui permet de créer des cartes interactives: https://rstudio.github.io/leaflet/
Vous n’aurez pas besoin de maîtriser ce package pour faire vos premières cartes interactives. Il vous suffira d’appliquer la fonction tmap_leaflet()
à une carte tmap créée pour la rendre interactive (à la manière de ggplotly()
pour un graphique ggplot).
tmap_leaflet(carte3)
Il nous arrive parfois de devoir convertir un data frame en sf. C’est en particulier le cas quand on reçoit un fichier avec des coordonnées géographiques (longitude,latitude).
MMM_MMM_GeolocCompteurs <- read_csv("https://data.montpellier3m.fr/sites/default/files/ressources/MMM_MMM_GeolocCompteurs.csv")
MMM_MMM_GeolocCompteurs
## # A tibble: 46 × 6
## `Nom du com` `N° Série` N° Sér_…¹ Latit…² Longi…³ OSM_L…⁴
## <chr> <chr> <chr> <dbl> <dbl> <dbl>
## 1 Compteur Vélo Tanneurs XTH19101158 XTH19101… 43.6 3.87 1.89e8
## 2 Compteur Piéton/Vélo Berracasa X2H19070220 X2H19070… 43.6 3.90 1.21e8
## 3 Compteur Vélo Lodève Celleneuve Y2H20042633 X2H20042… 43.6 3.83 7.34e8
## 4 Compteur Vélo Lavérune X2H20042632 X2H20042… 43.6 3.81 9.77e7
## 5 Compteur Vélo Vieille poste Y2H20063161 X2H20063… 43.6 3.91 6.77e8
## 6 Compteur Vélo Delmas 2 Y2H20063164 X2H20063… 43.6 3.90 1.06e8
## 7 Compteur Vélo Delmas 1 Y2H20063163 X2H20063… 43.6 3.90 1.06e8
## 8 Compteur Vélo Gerhardt Y2H20063162 X2H20063… 43.6 3.87 2.32e7
## 9 Compteur Vélo Lattes 2 Y2H20042634 X2H20042… 43.6 3.93 2.59e7
## 10 Compteur Vélo Lattes 1 Y2H20042635 X2H20042… 43.6 3.93 1.37e8
## # … with 36 more rows, and abbreviated variable names ¹`N° Sér_1`, ²Latitude,
## # ³Longitude, ⁴OSM_Line_i
Il vous suffira d’utiliser la fonction st_as_sf()
pour transformer votre table en objet spatial (sf) dans laquelle vous preciser les colonnes contenant les longitudes et latitudes.
MMM_MMM_GeolocCompteurs_sf <- MMM_MMM_GeolocCompteurs %>%
st_as_sf(coords = c("Longitude","Latitude"))
Une fois transformée, on peut bien sûr créer une nouvelle carte:
carte_compteur <- tm_shape(MMM_MMM_GeolocCompteurs_sf)+
tm_dots(col="red",size = 0.1)
carte_compteur_finale <- carte2+
carte3+
carte_compteur+
tm_layout(main.title ='Aménagements cyclables de Montpellier Méditerranée Métropole',
main.title.size=1,
inner.margins=0.1,
legend.outside = T,
legend.text.size=0.4)+
tm_credits("Source: Montpellier Mediterranée Métropole",position = c(0,0))+
tm_compass()+
tm_add_legend('symbol',
col = "red",
size = 0.1,
labels = "Compteurs")
Et même apporter un peu d’interactions !
Alors, on se met en selle 🚴 ?
Bureau d'étude D-SIDD
D-SIDD est un bureau d’études spécialisé dans la valorisation des données. D-SIDD apporte aux décideurs des outils simples leur permettant de comprendre et de s’approprier les problématiques abordées.
Explorer les territoires: Explorer les territoires à travers les données pour s’approprier les problématiques, se délester des à-priori et identifier des territoires de comparaison.
Mesurer le potentiel: Traiter et valoriser les données, mesurer l’impact et la faisabilité d’un projet pour calibrer une offre au plus proche des besoins identifiés.
Vulgariser: Synthétiser les résultats à travers des supports de datavisualisation interactifs ou statiques facilitant le partage des résultats.
Former: Transmettre un savoir-faire pour vous permettre de vous approprier vos données à travers les ressources libres disponibles (RStudio notamment).
Arnaud : Un peu statisticien mais aussi passionné par le développement territorial et par l’émergence de projets alternatifs, j’ai créé D-SIDD en 2016. De la collecte à l’analyse et à la vulgarisation des données, je puise dans toutes les ressources disponibles pour apporter un appui décisif et détaillé aux décideurs. R est bien sûr ma ressource préférée 😊 D-SIDD est hébergée dans la coopérative d’activité et d’emploi Crealead à Montpellier depuis le début. C’est pour nous une manière de trouver un peu de cohérence entre nos aspirations et notre mode de travail. C’est dans ce cadre que j’ai rencontré Emmanuelle, statisticienne à l’incroyable talent 😊
Emmanuelle : Spécialisée dans la donnée des territoires depuis plus de 20 ans, mon expérience couvre de nombreux domaines : activités, emploi, formation, infrastructures, énergies, logement, construction etc. En 2022, après avoir développé des compétences R, j’ai souhaité relever le défi de l’entrepreneuriat et me rapprocher d’un collectif innovant, dynamique et solidaire 😇. En m’accueillant au sein de sa marque d-sidd, Arnaud m’a permis de concrétiser mon projet et de m’associer à un spécialiste de R.
Nos compétences complémentaires nous facilitent la compréhension des enjeux de nos commanditaires et le champ des possibles pour y répondre💪.
C’est possible en faisant un don sur la page Tipeee du blog
Enregistrez vous pour recevoir gratuitement mes fiches “aide mémoire” (ou cheat sheets) qui vous permettront de réaliser facilement les principales analyses biostatistiques avec le logiciel R et pour être informés des mises à jour du site.
11 réponses
Bonjour,
Merci pour cette présentation très intéressante.
Savez vous s’il est possible de créer un organigramme du personnel d’une direction d’entreprise ?
Merci a vous
Bonjour,
Oui, il est tout à fait possible de créer un organigramme du personnel d’une direction d’entreprise avec R. Il existe plusieurs packages R qui peuvent vous aider à créer des organigrammes et des diagrammes de flux.
L’un des packages les plus populaires est “diagrammeR”. Ce package fournit une syntaxe simple pour créer des diagrammes de flux, des organigrammes et des diagrammes conceptuels. Vous pouvez utiliser la fonction “grViz” pour dessiner des graphes en utilisant la syntaxe DOT ou la syntaxe R. Vous pouvez également utiliser la fonction “graphvizChart” pour dessiner des graphes en utilisant la bibliothèque Graphviz.
Voici un exemple simple d’utilisation de “diagrammeR” pour créer un organigramme :
# Installation du package
install.packages("diagrammeR")
# Chargement du package
library(diagrammeR)
# Création d'un graphique de type organigramme
grViz("
digraph {
graph [rankdir = \"TB\"]
node [shape = \"rectangle\"]
A [label = \"Direction\"]
B [label = \"RH\"]
C [label = \"Marketing\"]
D [label = \"Finance\"]
E [label = \"Comptabilité\"]
F [label = \"Informatique\"]
G [label = \"Logistique\"]
H [label = \"Production\"]
I [label = \"Achats\"]
J [label = \"Qualité\"]
A -> B
A -> C
A -> D
D -> E
D -> F
D -> G
D -> H
D -> I
D -> J
}
")
Dans cet exemple, nous avons créé un organigramme de la direction d’une entreprise fictive avec des nœuds représentant différents départements et des flèches reliant les nœuds pour montrer la hiérarchie.
Vous pouvez personnaliser l’organigramme en modifiant la couleur, la forme et le style des nœuds et des flèches en utilisant les options de la fonction “grViz”. Vous pouvez également ajouter des étiquettes, des images et des liens à vos nœuds en utilisant les options de la fonction.
Il existe également d’autres packages R pour créer des organigrammes, tels que “orgchart” et “DiagrammeRsvg”.
Bonne continuation
bonjour j’ai vraiment adoré merci
Merci beaucoup,
J’ai l’impression d’avoir compris l’utilisation d’outils de cartographie avec ces exemples.
Les codes postaux (ou codes géographiques INSEE) peuvent ils être utilisés comme données de localisation directement ou est il nécessaire de les “transformer” (et comment ?) auparavant ?
Merci encore et bravo à Claire pour ces idées
Bonjour,
pour réaliser des cartes, il vous faut des coordonnées géographiques (points, lignes, polygones,..). Les codes INSEE ou postaux n’en sont pas mais vous permette néanmoins de les obtenir par exemple à travers l’IGN : https://www.data.gouv.fr/fr/datasets/admin-express/ . Une fois importé dans R, vous pourrez ensuite filtrer sur la commune de votre choix via son code INSEE ou son nom si vous préférez.
Bonne exploration:)
Nous vous remercions pour cette opportunité si vous pouvez nous apprendre plus sur R et Rsat ça nous ferait plaisir
Très intéressante présentation. Pour élargir la demande de Tung, peut-on réunir les deux domaines, càd faire une représentation géographique d’un organigramme avec les commerciaux Dupont en charge de l’Aquitaine (30 clients), Durand de la Normandie (12clients) et Smith de l’Alsace (24 clients), le tout visualisable sur une carte de France
Bonjour Dominique,
C’est sûrement possible, mais je n’ai pas trouvé de solution rapide.
Bonne continuation
Bonjour,
merci pour cet article.
Deux questions totalement indépendantes ;
1. Dans quelle mesure il est préférable d’utiliser tm plutôt que ggplot pour faire des cartes ?
2. Comment vous gérer les représentations sur plusieurs années, je m’explique ;
Sur plusieurs années il y a potentiellement, des fusions/découpages de communes, donc les centroïdes ne sont pas les mêmes ou pire encore, le polygone de la commune.. cela concerne quelques cas exceptionnels mais non négligeable surtout quand on souhaite agréger des données.
Merci
Jeremy
Bonjour,
Au sujet de la représentation des communes sur plusieurs années, je vois deux façons de traiter la question :
a) Travailler au préalable sur tableur les données des communes passées pour les actualiser avec les codes des communes à jour, en utilisant la table de passage INSEE (ca marche assez bien je trouve), puis agréger sur les codes actuels des communes (dernier millésime) et faire la jointure sur la table spatiale des polygones de communes du dernier millésime. Pour la table de passage des codes communes, c’est hyper précieux et c’est ici : https://www.insee.fr/fr/information/2028028
b) Travailler les données spatiales directement, à partir des différents millésimes des couches polygones des communes, pour regrouper ou séparer en fonction du dernier millésime. Pour des compléments sur le traitement des données spatiales : https://mtes-mct.github.io/parcours_r_module_analyse_spatiale/
Bonne continuation
Bonjour Jérémy
Il y a effectivement de multiples possibilités de packages pour réaliser des cartes. Il m’arrive également d’utiliser ggplot2 avec sa fonction geom_sf. J’ai l’impression que tmap est un peu un package de cartographes alors que ggplot2 est plus peut être plus généraliste. Mon principal intérêt quand j’utilise geom_sf est qu’il me retourne des objets de classes ggplot2 qui peuvent facilement interagir avec d’autres objets de classes ggplot2 avec les packages cowplot ou ggrepel par exemple. tmap me permet quant à lui de réaliser des cartes sur rmarkdown avec la possibilité de les rendre très facilement interactives (tmap_leaflet()). Voici une petite analyse comparative plus complète: https://cengel.github.io/R-spatial/mapping.html
Bonne lecture:)
Arnaud