Créer une carte avec R — rgeoapi et ggplot2
Pensé pour simplifier les travaux de cartographie, rgeoapi est un package qui interroge la base de données géographique française. Résultat : des visualisations de cartes, easy peasy. Si si.
rgeoquoi ?
Disponible sur Github, rgeoapi
permet d’effectuer des requêtes sur la base de données cartographique française. Pour quoi faire dites-vous ? Ce package vous permet, entre autres, d’obtenir les coordonnées d’une ville à partir de son nom, de son code INSEE ou encore de son code postal. How cool is that?
Pour installer rgeoapi :
devtools::install_github("ColinFay/rgeoapi")
Récupérer les coordonnées des villes
Imaginons donc que vous possédiez un jeu de données avec pour unique référent géographique les noms des villes à représenter. Dans l’idées, nous aurions :
villes <- data.frame(nom = c("Rennes", "Lorient", "Brest", "Vannes"), variable1 = c("a", "b", "c", "b"), variable2 = c("Un", "Deux", "Un", "Deux"))
nom | variable1 | variable2 |
---|---|---|
Rennes | a | Un |
Lorient | b | Deux |
Brest | c | Un |
Vannes | b | Deux |
Pour représenter ces données sur une carte de manière précise, vous aurez besoin des coordonnées des villes. C’est à ce moment qu’entre en scène rgeoapi
!
Nous lançons donc une requête sur les noms contenus dans notre data.frame.
library(rgeoapi)
library(plyr)
geo <- ldply(villes$nom, ComByName)
name | codeInsee | codeDepartement | codeRegion | population |
---|---|---|---|---|
Rennes | 35238 | 35 | 53 | 211373 |
Rennes-le-Château | 11309 | 11 | 76 | 58 |
Rennes-les-Bains | 11310 | 11 | 76 | 258 |
Rennes-sur-Loue | 25488 | 25 | 27 | 88 |
Rennes-en-Grenouilles | 53189 | 53 | 52 | 117 |
Lorient | 56121 | 56 | 53 | 57961 |
Brest | 29019 | 29 | 53 | 139386 |
Brestot | 27110 | 27 | 28 | 518 |
Esboz-Brest | 70216 | 70 | 27 | 485 |
Vannes | 56260 | 56 | 53 | 53032 |
Vannes-le-Châtel | 54548 | 54 | 44 | 579 |
Pouy-sur-Vannes | 10301 | 10 | 44 | 145 |
Saulxures-lès-Vannes | 54496 | 54 | 44 | 363 |
Vannes-sur-Cosson | 45331 | 45 | 24 | 589 |
surface | lat | long | X_score |
---|---|---|---|
5035 | 48.11 | -1.679 | 1 |
1497 | 42.91 | 2.277 | 0.7636 |
1975 | 42.92 | 2.341 | 0.7533 |
547 | 47.01 | 5.855 | 0.6743 |
801 | 48.49 | -0.5083 | 0.6239 |
1533 | 47.75 | -3.378 | 1 |
4948 | 48.4 | -4.502 | 0.7183 |
884 | 49.34 | 0.6783 | 0.6958 |
977 | 47.8 | 6.441 | 0.4919 |
3313 | 47.65 | -2.749 | 1 |
1747 | 48.57 | 5.785 | 0.7384 |
1579 | 48.3 | 3.597 | 0.6873 |
1826 | 48.52 | 5.804 | 0.678 |
3558 | 47.72 | 2.202 | 0.6653 |
À noter : à partir d’un nom, il est possible que le package vous retourne plusieurs résultats pour une même requête. Ce pour plusieurs raisons :
- Plusieurs villes possèdent cette chaine de caractères dans leur nom
- La commune en question couvre plusieurs codes postaux et le paramètre `postal` est `TRUE` (ce dernier est `FALSE` par défaut)
- Votre requête est en _partial match_
Nous avons donc ici un tableau qui nous retourne toutes les coordonnées des villes qui nous intéressent, avec leur surface et leur population. Bien, ne reste plus qu’à effectuer une jointure des deux !
names(villes)[1] <- "name"
villes <- merge(villes, geo, by = "name", all.x = TRUE)
Passons maintenant aux choses sérieuses.
Créer une carte avec ggmap et ggplot2
Le package ggmap
a été spécialement pensé pour produire des fonds de cartes à insérer en background de vos ggplot2
, autrement dit des cartes qui seront utilisées comme couche de mapping
de votre visualisation. La fonction rapide de carte est qmap
(une terminologie qui devrait sonner familière aux adeptes des qplot
de ggplot
) – le premier argument faisant référence à la requête (ville / département / région…) et le second au niveau de zoom de Google map.
library(ggmap)
map <- qmap('Bretagne', zoom = 8)
Une fois l’objet map
créé, il ne vous reste qu’à l’utiliser comme première layer de votre fonction ggplot
, en utilisant les fonctions geom
habituelles :
map + geom_point(data = villes, aes(x = long, y = lat, color= variable2, size = surface))
Et voilà, c’est presque trop simple ! N’hésitez pas à me faire vos retours sur rgeoapi directement sur GitHub, ou à m’envoyer vos questions sur le package via mail.
What do you think?