Suite

R : Comment créer une carte thermique avec le paquet de dépliants

R : Comment créer une carte thermique avec le paquet de dépliants


J'ai lu un article sur les cartes interactives avec R en utilisant lebrochurepaquet.

Dans cet article, l'auteur a créé une carte thermique comme celle-ci :

X=cbind(lng,lat) kde2d <- bkde2D(X, bande passante=c(bw.ucv(X[,1]),bw.ucv(X[,2])))) x=kde2d$x1 y=kde2d $x2 z=kde2d$fhat CL=contourLines(x , y , z) m = feuillet() %>% addTiles() m %>% addPolygons(CL[[5]]$x,CL[[5]]$ y,fillColor = "rouge", stroke = FALSE)

je ne connais pas lebkde2Dfonction, donc je me demande si ce code pourrait être généralisé à n'importe quel fichier de formes?

Et si chaque nœud avait un poids spécifique, que nous aimerions représenter sur la carte thermique ?

Existe-t-il d'autres façons de créer une carte thermique avecbrochurecarte en R ?


Voici mon approche pour créer une carte thermique plus généralisée dans Leaflet à l'aide de R. Cette approche utiliseLignes de contour, comme le billet de blog mentionné précédemment, mais j'utilises'appliquerpour parcourir tous les résultats et les convertir en polygones généraux. Dans l'exemple précédent, c'est à l'utilisateur de tracer individuellement chaque polygone, donc j'appellerais cela "plus généralisé" (du moins c'est la généralisation que je voulais quand j'ai lu le billet de blog !).

## INITIALIZE library("leaflet") library("data.table") library("sp") library("rgdal") # library("maptools") library("KernSmooth") inurl <- "https:// data.cityofchicago.org/api/views/22s8-eq8h/rows.csv?accessType=DOWNLOAD" infile <- "mvthefts.csv" ## LOAD DATA ## En outre, nettoyez les noms de variables et convertissez les dates if(!file .exists(infile)){ download.file(url = inurl, destfile = infile) } dat <- data.table::fread(infile) setnames(dat, tolower(colnames(dat))) setnames(dat, gsub( " ", "_", colnames(dat))) dat <- dat[!is.na(longitude)] dat[ , date := as.IDate(date, "%m/%d/%Y")] ## FAIRE DES LIGNES DE CONTOUR ## Remarque, le choix de la bande passante est basé sur MASS::bandwidth.nrd() kde <- bkde2D(dat[ , list(longitude, latitude)], bande passante=c(.0045, .0068), gridsize = c(100,100)) CL <- contourLines(kde$x1 , kde$x2 , kde$fhat) ## EXTRACT CONTOUR LINE LEVELS LEVS <- as.factor(sapply(CL, '[[', "level")) NLEV <- length(levels(LEVS)) ## CONVERTIR LES LIGNES DE CONTOUR EN POLYGONES pgons <- lapply(1:length(CL), function(i) Polygons(list( Polygon(cbind(CL[[i]]$x, CL[[i]]$y))), ID=i)) spgons = SpatialPolygons(pgons) ## Leaflet map with polygons leaf(spgons) %>% addTiles () %>% addPolygons(color = heat.colors(NLEV, NULL)[LEVS])

Voici ce que vous aurez à ce stade :

## Carte dépliante avec des points et des polygones ## Remarque, cela montre quelques problèmes avec le KDE, à mon avis… ## Par exemple, il semble y avoir un point chaud à l'intersection de Mayfield et ## Fillmore, mais il n'est pas choisi en haut. Peut-être qu'un plus petit pc est une bonne idée ? brochure(spgons) %>% addTiles() %>% addPolygons(color = heat.colors(NLEV, NULL)[LEVS]) %>% addCircles(lng = dat$longitude, lat = dat$latitude, radius = .5 , opacité = .2, col = "bleu")

Et voici à quoi ressemblerait la carte thermique avec des points :

Voici un domaine qui me suggère que je dois régler certains paramètres ou peut-être utiliser un noyau différent :

## Carte de dépliants avec des polygones, utilisant Spatial Data Frame ## Au départ, je pensais que la structure du data frame était nécessaire ## Cela semble donner les mêmes résultats, mais il y a peut-être ## avantages à utiliser le data.frame, par ex. pour ajouter plus de colonnes spgonsdf = SpatialPolygonsDataFrame(Sr = spgons, data = data.frame(level = LEVS), match.ID = TRUE) brochure() %>% addTiles() %>% addPolygons(data = spgonsdf, color = heat .colors(NLEV, NULL)[[email protected]$level])

En s'appuyant sur la réponse de genorama ci-dessus, vous pouvez également convertir la sortie de bkde2D en un raster plutôt qu'en courbes de niveau, en utilisant les valeurs fhat comme valeurs de cellule raster

bibliothèque("leaflet") bibliothèque("data.table") bibliothèque("sp") bibliothèque("rgdal") # bibliothèque("maptools") bibliothèque("KernSmooth") bibliothèque("raster") inurl <- "https ://data.cityofchicago.org/api/views/22s8-eq8h/rows.csv?accessType=DOWNLOAD" infile <- "mvthefts.csv" ## LOAD DATA ## Aussi, nettoyez les noms de variables et convertissez les dates si (!file.exists(infile)){ download.file(url = inurl, destfile = infile) } dat <- data.table::fread(infile) setnames(dat, tolower(colnames(dat))) setnames(dat , gsub(" ", "_", colnames(dat))) dat <- dat[!is.na(longitude)] dat[ , date := as.IDate(date, "%m/%d/%Y ")] ## Créer une sortie de densité de noyau kde <- bkde2D(dat[ , list(longitude, latitude)], bande passante=c(.0045, .0068), gridsize = c(100,100)) # Créer un raster à partir de la sortie de densité de noyau KernelDensityRaster <- raster(list(x=kde$x1 ,y=kde$x2 ,z = kde$fhat)) #create pal fonction pour colorer le raster palRaster <- colorNumeric("Spectral", domain = [email protected]@values ) ## Carte de dépliant avec dépliant raster() %>% addTiles() % >% addRasterImage(KernelDensityRaster, colours = palRaster, opacity = .8) %>% addLegend(pal = palRaster, values ​​= [email protected]@values, title = "Kernel Density of Points")

Ceci est votre sortie. Notez que les valeurs de faible densité apparaissent toujours comme colorées dans le raster.

Nous pouvons supprimer ces cellules de faible densité avec les éléments suivants :

#définissez les cellules de faible densité comme NA afin que nous puissions les rendre transparentes avec la fonction colorNumeric [email protected]@values[which([email protected]@values ​​< 1)] <- NA #create pal fonction pour colorer le raster palRaster <- colorNumeric( "Spectral", domaine = [email protected]@values, na.color = "transparent") ## Redessiner le dépliant de la carte() %>% addTiles() %>% addRasterImage(KernelDensityRaster, colours = palRaster, opacity = .8) %>% addLegend(pal = palRaster, values ​​= [email protected]@values, title = "Kernel Density of Points")

Désormais, toute cellule raster avec une valeur inférieure à 1 est transparente.

Si vous voulez un raster groupé, utilisez la fonction colorBin plutôt que la fonction colorNumeric :

palRaster <- colorBin("Spectral", bins = 7, domain = [email protected]@values, na.color = "transparent") ## Carte de feuillet avec feuillet raster() %>% addTiles() %>% addRasterImage(KernelDensityRaster , colours = palRaster, opacity = .8) %>% addLegend(pal = palRaster, values ​​= [email protected]@values, title = "Kernel Density of Points")

Pour le rendre plus fluide, augmentez simplement la taille de la grille dans la fonction bkde2D. Cela augmente la résolution du raster généré. (je l'ai changé en

taille de la grille = c(1000,1000)

Production:


Un moyen simple de créer des cartes thermiques Leaflet dans R consiste à utiliser le plugin Leaflet.heat. Un excellent guide sur la façon de l'utiliser peut être trouvé ici. J'espère que vous le trouverez utile.