18 Interactive Geographic Data
Ce chapitre est à l’origine une contribution communautaire de AkhilPunia
En cours de progression. Toute amélioration est la bienvenue. Si vous souhaitez participer rendez vous sur contribuer au repo.
18.1 Vue d’ensemble
Vous connaissez certainement différentes libraries pour afficher des données géographiques telles que ggmap
etchoroplethr
. Bien que ces libraries fournissent de nombreuses fonctionnalités intéressantes pour mieux présenter les informations avec des graphes 2D, ils leur manquent encore une caractéristique importante : l’interactivité. Voici “leaflet” - une librairie écrit en javascript pour gérer les cartes interactives. Fait amusant : il est activement utilisé par de nombreux grands journaux, tels que le New York Times ou le Washington Post.
Plongeons nous dedans.
18.2 Brève description du jeu de données
Pour notre analyse, nous utiliserons le NYC Open Data décrivant les écoles de New York City en 2016. Vous en trouverez plus sur la page Kaggle. Nous allons nous concentrer sur les distributions de différentes variables en tant que facteur de positions géographiques.
18.3 Plotting Markers
Ici, nous pouvons voir que toutes les écoles privées à New York ont été tracées sur une carte que l’on peut zoomer et dézoomer. Les marqueurs sont utilisés pour indiquer l’emplacement de chaque école. Si nous survolons un marqueur, il affiche le nom de l’école. Trop cool, non ?!
Voici le code :
18.4 Heatmaps dynamiques
Les Heatmaps sont des outils vraiment utiles pour visualiser la distribution d’une variable particulière sur une région donnée (ils sont si utiles que nous avons une page sur eux). Dans cet exemple, nous voyons comment leaflet
est capable de calculer dynamiquement le nombre d’écoles dans une région donnée à partir de données de latitude et de longitude uniquement. Vous pouvez en faire l’expérience en effectuant un zoom avant ou arrière dans le graphique.
Voici le code :
18.5 Clustering dynamique
Nous pouvons voir ici comment leaflet
permet de regrouper dynamiquement des données en fonction de leur distance géographique à un niveau de zoom donné.
Voici le code :
18.6 Afficher les groupes
Voici le code :
top<- schools %>%
group_by(District)%>%
summarise(top=length(unique(`School Name`)),lon=mean(Longitude),lat=mean(Latitude))%>%
arrange(desc(top))%>%
head(10)
pal <- colorFactor(viridis(100),levels=top$District )
top %>%
leaflet(options = leafletOptions(dragging = TRUE)) %>%
addProviderTiles(providers$CartoDB.DarkMatterNoLabels) %>%
addCircleMarkers(radius=~top/10,label=~paste0("District ", District," - ", top," Schools"),color=~pal(District),opacity = 1) %>%
setView(lng=lon,lat=lat, zoom = 10) %>%
addLegend("topright", pal = pal,
values = ~District,
title = "District",
opacity = 0.8)
18.7 Afficher des données catégorielles
Nous pouvons visualiser la distribution d’une catégorie particulière sur la carte. Ceci est réalisé grâce à un widget interactif situé en haut à droite qui permet de choisir une ou plusieurs catégories particulières. L’exemple ci-dessous montre comment les écoles de diffèrents, certains quartiers sont séparés de manière raciale.
Voici le code :
ss <- schools %>% dplyr::select(`School Name`,Latitude, Longitude,`Percent White`, `Percent Black`, `Percent Asian`, `Percent Hispanic`)
segregation <- function(x){
majority = c()
w <- gsub("%","",x$`Percent White`)
b <- gsub("%","",x$`Percent Black`)
a <- gsub("%","",x$`Percent Asian`)
h <- gsub("%","",x$`Percent Hispanic`)
for (i in seq(1,nrow(ss))){
if (max(w[i],b[i],a[i],h[i]) == w[i])
{majority <- c(majority,'White')}
else if (max(w[i],b[i],a[i],h[i]) == b[i])
{majority <- c(majority,'Black')}
else if (max(w[i],b[i],a[i],h[i]) == a[i])
{majority <- c(majority,'Asian')}
else if (max(w[i],b[i],a[i],h[i]) == h[i])
{majority <- c(majority,'Hispanic')}
}
return(majority)
}
ss$race <- segregation(ss)
white <- ss %>% filter(race == "White")
black <- ss %>% filter(race == "Black")
hispanic <- ss %>% filter(race == "Hispanic")
asian <- ss %>% filter(race =="Asian")
lng <- median(ss$Longitude)
lat <- median(ss$Latitude)
pal_sector <- colorFactor( viridis(4), levels = ss$race)
m3 <- leaflet() %>% addProviderTiles("CartoDB") %>%
addCircleMarkers(data = white, radius = 2, label = ~htmlEscape(`School Name`),
color = ~pal_sector(race), group = "White")
m3 %>% addCircleMarkers(data = black, radius = 2, label = ~htmlEscape(`School Name`),
color = ~pal_sector(race), group = "Black") %>%
addCircleMarkers(data = hispanic, radius = 2, label = ~htmlEscape(`School Name`),
color = ~pal_sector(race), group = "Hispanic") %>%
addCircleMarkers(data = asian, radius = 2, label = ~htmlEscape(`School Name`),
color = ~pal_sector(race), group = "Asian") %>%
addLayersControl(overlayGroups = c("White", "Black","Hispanic","Asian")) %>%
setView(lng=lng,lat=lat,zoom=10)
Ces exemples ne donnent qu’un aperçu de ce qui est vraiment possible avec cette librairie. Si vous souhaitez explorer davantage de fonctionnalités et de cas d’utilisation, consultez les liens ci-dessous.
18.8 External Resources
- Leaflet in R Documentation: documentation principale du package.
- Basic leaflet maps in R: tutoriel avec exemples.
- Interesting Kaggle Kernel visualizing earthquake data using leaflet in R: un autre cas d’étude à explorer.
with