Leaflet est une bibliothèque JavaScript libre de cartographie en ligne, elle est notamment utilisée par le projet de cartographie libre et ouverte OpenStreetMap, ainsi que par exemple par “The New York Time”, “The Washington Post”, GitHub ou encore Flickr.
R dispose d’un package simplement intitulé “leaflet” qui permet de réaliser des cartes dynamiques tout en codant en R mais avec la puissance et la diversité offerte par le package JS original. Vous pouvez retrouver la liste des possibilités offertes par ce package sur la page officielle.

Aujourd’hui nous allons parcourir ensemble les basiques de la création de cartes dynamiques avec R Leaflet.

Les bases de R Leaflet

Tout d’abord on n’oublie pas d’installer/charger le package dans R :

install.packages("leaflet", dependencies = TRUE)

library(leaflet)


Ensuite, voici comment créer son premier fond de carte :

m <- leaflet() %>% addTiles()
m

NB: Le symbole %>% est l’équivalent d’un pipe en R et permet de chainer plusieurs actions.

carto0


Et voici comment spécifier un emplacement (ie. une latitude et une longitude) et un zoom par défaut (plutôt que l’ensemble du monde ^^) :

m <- leaflet() %>% addTiles() %>% 
      setView(lng = -1.5533600, lat = 47.2172500, zoom = 10) 
m

carto1

Coucou Nantes ! ;)


Autre exemple :

m <- leaflet() %>% addTiles() %>% 
      setView(lng = 2.292551, lat = 48.858255, zoom = 16) 
m

carto3

Hello Grande Dame de Fer ;)

Ajouter des points spécifiques sur une carte

Il est possible de marquer un point particulier sur une carte et d’y associer un descriptif lors du clic.
Ici par exemple, “La Tour Eiffel” :

m <- leaflet() %>%
      addTiles() %>%
      setView(lng = 2.292551, lat = 48.858255, zoom = 16) %>%
      addMarkers(lng = 2.2945, lat = 48.858255, popup = "La Tour Eiffel")
m

carto4


Personnaliser la description des points

Cela peut être personnalisé en modifiant le contenu du descriptif :

description <- paste(sep = "<br/>",
                     "<b>La Tour Eiffel</b>",
                     "Paris, France",
                     "<img src='http://www.toureiffel.paris/images/galerie/photos/06_Tour-de-jour-rapprochee-SETE-Photographe-Bertrand-Michau.jpeg' height='40' width='50'>",
                     "<a href='http://www.toureiffel.paris/'>Voir le site </a>")

m <- leaflet() %>%
  addTiles() %>%
  setView(lng = 2.292551, lat = 48.858255, zoom = 16) %>%
  addMarkers(lng = 2.2945, lat = 48.858255, popup = description)
m

NB: Ici on utilise la fonction R “paste” permettant de concaténer des chaînes de caractères et on lui passe directement du texte avec des balises HTML afin d’insérer dans la description un lien, une image, une mise en forme spécifique, etc.

carto5


Modifier la forme de l'icône représentant un point

Ou bien encore en modifiant l’icône permettant de repérer le point en particulier :

# Définition d'un nouvel icône
EiffelTower <- makeIcon(
  iconUrl = "img/eiffel-tower.png",
  iconWidth = 40, iconHeight = 40)

m <- leaflet() %>%
  addTiles() %>%
  setView(lng = 2.292551, lat = 48.858255, zoom = 16) %>%
  addMarkers(lng = 2.2945, lat = 48.858255, popup = "La Tour Eiffel", icon = EiffelTower)
m

carto6


Marquer plusieurs points en une seule fois

Enfin, il est aussi possible de marquer un ensemble de points en un seul appel à “leaflet”, en stockant les données dans un élément R de type data.frame :

points <- data.frame(longitudes = c(-1.5640409999999747, -1.5582119000000603, -1.5462400000000116),
                     latitudes = c(47.205581, 47.217589, 47.21545),
                     labels = c("Elephant", "Tour de Bretagne", "Tour Lu"))

m <- leaflet(points) %>%
  addTiles() %>%
  setView(lng = -1.5533600, lat = 47.2172500, zoom = 12)  %>%
  addMarkers(lng = ~longitudes, lat = ~latitudes, popup = ~labels)
m

carto7

Représenter d'autres formes sur une carte

Nous allons à présent représenter les populations de plusieurs villes de France par des cercles de tailles proportionnelles à la population de chaque ville.
Pour cela on commence par créer un jeu de données avec : nom de la ville, latitude, longitude et population :

villes <- data.frame(Ville = c("Paris", "Lille", "Nantes", "Marseille"),
                     Latitude = c(48.85661400000001, 50.62924999999999, 47.218371, 43.296482),
                     Longitude = c(2.3522219000000177, 3.057256000000052, -1.553621000000021, 5.369779999999992),
                     Population = c(2249975, 227560, 284970, 850726))

Puis on crée une carte avec “leaflet” représentant tout ça, grâce à la fonction “addCircles” :

m <- leaflet(villes) %>% addTiles() %>%
                         addCircles(lng = ~Longitude, lat = ~Latitude, weight = 1,
                                    radius = ~sqrt(Population) * 50, popup = ~paste(Ville, ":", Population),
                                    color = "#a500a5", fillOpacity = 0.5)
m

NB: Rappel R, pour accéder à l’aide d’une fonction et notamment voir le détail des paramètres qu’elle peut prendre en entrée, il suffit par exemple de taper : ?addCircles .

carto8


Ajouter un dégradé de couleurs

Nous allons à présent améliorer cette carte en colorant les cercles à l’aide d’un dégradé relatif à la population de chaque ville :

couleurs <- colorNumeric("YlOrRd", villes$Population, n = 5)

La fonction “colorNumeric” va permettre de générer une fonction prenant en paramètre une variable numérique et lui associant n paliers de couleurs (ici 5) générés proportionnellement selon les valeurs de tailles de population disponibles dans notre jeu de données.
Le paramètre “YlOrRd” correspond à un dégradé de couleurs du rouge foncé au jaune très pâle déjà prédéfini dans R. Pour retrouver une sélection de dégradés prédéfinis dans R, voir par exemple ici.

Nous allons maintenant appliquer ce dégradé de couleurs sur notre carte :

m <- leaflet(villes) %>% addTiles() %>%
                         addCircles(lng = ~Longitude, lat = ~Latitude, weight = 1,
                                    radius = ~sqrt(Population) * 50, 
                                    popup = ~paste(Ville, ":", Population),
                                    color = ~couleurs(Population), fillOpacity = 0.9)
m

carto9


Ajouter une légende

Cet ajout de couleurs en plus de la taille des cercles donne un bon aperçu des différences de populations entre les villes, mais dans quelle mesure, cela est difficile à savoir.
On va donc compléter notre carte en ajoutant une légende pour nos couleurs :

m <- leaflet(villes) %>% addTiles() %>%
                         addCircles(lng = ~Longitude, lat = ~Latitude, weight = 1,
                                    radius = ~sqrt(Population) * 50, 
                                    popup = ~paste(Ville, ":", Population),
                                    color = ~couleurs(Population), fillOpacity = 0.9) %>%
                         addLegend(pal = couleurs, values = ~Population, opacity = 0.9)

m

carto10


NB: Jusqu’à présent vous n’avez pu voir que des images fixes (screenshots) des rendus mais bien sûr, les rendus réellement générés sont interactifs.
Voici ci-dessous ce à quoi cela ressemble :


Avec ces éléments, vous pouvez dès à présent créer vos premières cartes dynamiques simplement et rapidement ! Vous pouvez d’ailleurs retrouver le code présenté ici sur github.
Bien sûr, il est possible d’aller plus loin, notamment en exploitant les nombreuses fonctionnalités de la librairie JS “leaflet” aussi disponible dans le package R éponyme. Egalement, “leaflet” s’intègre très bien dans les applications R Shiny.

Alors à vous de jouer ! N’hésitez pas à partager en commentaires des liens vers vos réalisations :)

Partager