Créer une carte avec R — rgeoapi et ggplot2

3 minute(s) read

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))

Réaliser une carte avec R, ggplot2 et rgeoapi

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?