Création d’une carte interactive avec leaflet

En lisant cet article de Yann Guégan évoquant le monde selon Bernard Guetta je me suis dis: « Tiens, et si je faisais une petite carte interactive avec des cercles proportionnels en utilisant les mêmes données! ».
Le journaliste explique sa méthodologie et présente tous les outils qu’il a mobilisé dans un deuxième article. Les données (en tout cas une partie) sont également diffusées dans format libre. Cette démarche ouverte permet de reproduire les analyses, les figures etc. Bref c’est du bon boulot!

Cartographie interactive

Pour réaliser cette carte, avec R bien sur, j’ai choisi d’utiliser le package leaflet. Ce package, disponible sur github, est construit en utilisant le package htmlwidgets et s’appuie sur la librairie javascript leaflet.

Le code

# Téléchargement des données
guetta <- url(description = "http://dansmonlabo.com/files/pays_v3.csv")
ctry <- read.csv(guetta)

# Téléchargement du fond de carte
worldmap <- url('http://wukan.ums-riate.fr/bernardguetto/world.RData')
load(worldmap)

# Nettoyage des données
## Sélection de certaines colonnes
ctry <- ctry[,c("code_pays_iso_a3","count", "PIB_2013_1000_no_blank",
                "geo_longitude",  "geo_latitude" )]
## Correction de la localisation du Vietnam
ctry[ctry$code_pays_iso_a3 == "VNM", 
     c("geo_longitude",  "geo_latitude")] <- c(107.8455,12.79458)
## Jointure avec le fond de carte pour obtenir les nom de pays
ctry <- merge(ctry, world@data[,c(2:3)], 
              by.x = "code_pays_iso_a3", by.y = "ISO3", all.x = T)
## Suppression des lignes non renseignées
ctry <- ctry[!is.na(ctry$geo_longitude),]
## Sélection des pays cités plus d'une fois
ctry <- ctry[ctry$count > 1,]

# Préparation des données 
## Tri du data frame de manière à avoir les cercles plus gros en dessous.
ctry <- ctry[order(ctry$count, decreasing = T),]
## Taille des rayons des cercles à afficher (en pixels)
ctry$size <- sqrt(ctry$count*4 / pi)
## Label des cercles (ce qui apparait quand on click dessus)
ctry$label <- paste("<b>", ctry$name, "</b> <br>Pays cité dans ", 
                    ctry$count, "chroniques.")

# Construction de la carte
library(leaflet)
## Initialisation 
m <- leaflet(padding = 0)
## Ajout des pays
m <- addPolygons(map = m, data = world, opacity = 100, 
                 color = "#FAFCFA", 
                 weight = 0.25,popup = NULL,
                 options = list(clickable = FALSE), 
                 fill = T, fillColor = "#B3C4B3", 
                 fillOpacity = 100)
## Ajout des cercles
m <- addCircleMarkers(map = m, 
                      lng = ctry$geo_longitude, 
                      lat = ctry$geo_latitude, 
                      radius = ctry$size, weight = 0.25, 
                      stroke = T, opacity = 100,
                      fill = T, fillColor = "#920000", 
                      fillOpacity = 100,
                      popup = ctry$label,
                      color = "white")
## Centrage de la carte 
m <- fitBounds(map = m, 
               lng1 = min(ctry$geo_longitude),
               lat1 = min(ctry$geo_latitude),
               lng2 = max(ctry$geo_longitude), 
               lat2 = max(ctry$geo_latitude))
## Dimensions de la carte
m$width <- 474
m$height <- 200

# Export de la carte en html
library(htmlwidgets)
saveWidget(m, 'map.html', selfcontained = TRUE)

Le résultat


Il est possible de zoomer et de se déplacer sur la carte, les cercles sont cliquables.
La carte est stockée dans un fichier html sur un serveur et incluse dans le post via un iframe.
Cliquer ici pour accéder à une version plus grande de la carte.

Quelques remarques

Le package leaflet est assez facile d’utilisation, même sans utiliser la syntaxe pipe à la mode (%>%).
Quelques problèmes subsistent :
– il n’est pas prévu de pouvoir rajouter une légende pour les cercles proportionnels;
– il n’est pas possible de changer la projection du fond de carte (comme il est possible de le faire avec le plugin Proj4Leaflet de la librairie javascript).

Merci à Yann Guégan pour le partage de ses données, de ses méthodos ainsi que pour sa réactivité (et l’inspiration pour l’image d’illustration :-)).


Une réflexion au sujet de « Création d’une carte interactive avec leaflet »

  1. Bonjour,
    Parmi les logiciels utilisés par Yann Guégan, il signale l’outil lexicométrique TMX. Ayant voulu en savoir plus, il est indiqué (entre autres) que :
    « L’expert peut utiliser les raccourcis clavier et surtout les possibilités de pilotage par scripts écrits dans des langages de programmation dynamique : […]
    – en langage R pour accéder à tous les packages R installés et aux objets créés par TXM (corpus, listes de mots…) ».

    Encore R : l’outil à tout faire, décidément…

    Fr. Stévenot

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *