En esta publicación de blog, proporciono un ejemplo de codificación en R sobre cómo crear un diagrama de dispersión basado en un mapa usando el paquete deckgl. Esto puede ser útil cuando se visualizan datos con algún aspecto espacial. Por ejemplo, es posible que desee visualizar la distribución geoespacial de ciertos grupos de propiedades.
Antes de que pueda aplicar la funcionalidad del paquete deckgl, necesito un conjunto de datos geocodificados, es decir, un conjunto de datos que contenga información sobre las coordenadas de longitud y latitud de la propiedad de interés. Para ello utilizaré una función de geocodificación aplicando la API de Open Street Map. Encontré la función en datascienceplus.com .
# osm geocoder
# source: https://datascienceplus.com/osm-nominatim-with-r-getting-locations-geo-coordinates-by-its-address/
osm_geocoder <- function(address = NULL)
{
if(suppressWarnings(is.null(address)))
return(data.frame())
tryCatch(
d <- jsonlite::fromJSON(
gsub('\\@addr\\@', gsub('\\s+', '\\%20', address),
'http://nominatim.openstreetmap.org/search/@addr@?format=json&addressdetails=0&limit=1')
), error = function(c) return(data.frame())
)
if(length(d) == 0)
return(data.frame())
return(data.frame(lon = as.numeric(d$lon), lat = as.numeric(d$lat)))
}
A continuación, necesito inicializar los datos que quiero trazar. Guardé una lista de ciudades en un archivo csv separado. Por lo tanto, leo este archivo y lo convierto en un marco de datos. Luego uso la función de geocodificación para geocodificar todas las ciudades en mi marco de datos. Además, agrego valores distribuidos normalmente a la columna de «entradas» y «salidas»; necesario para determinar, por ejemplo, el diseño del círculo en el diagrama de dispersión.
# ensuring that required packages are loaded
library(deckgl)
## deckgl 0.1.8 wrapping deckgljs 6.2.4
## Documentation: https://crazycapivara.github.io/deckgl/
## Issues, notes and bleeding edge: https://github.com/crazycapivara/deckgl
library(magrittr)
library(jsonlite)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
# setting up the data frames
scatter_data_df_1 <- data.frame(matrix(nrow=30,ncol=6))
column_names <- c("name","code","address","entries","exits","coordinates")
colnames(scatter_data_df_1) <- column_names
city_list_1_df <- read.csv("city list 1.csv",header = FALSE, stringsAsFactors = FALSE)
# geocode cities into longitude and latitude
for(i in 1:nrow(city_list_1_df)){
dum_coord <- osm_geocoder(toString(city_list_1_df$V1[i]))
scatter_data_df_1$name[i] <- paste0("city liste 1 : ",i)
scatter_data_df_1$code[i] <- c("CL1")
scatter_data_df_1$address[i] <- toString(city_list_1_df$V1[i])
scatter_data_df_1$entries[i] <- as.integer(rnorm(1,mean=3000,sd=1000))
scatter_data_df_1$exits[i] <- as.integer(rnorm(1,mean=3000,1000))
scatter_data_df_1$coordinates[i] <- list(c(as.numeric(dum_coord[1]),as.numeric(dum_coord[2])))
}
# print head of scatter_data_df_1
head(scatter_data_df_1)
## name code address entries exits
## 1 city liste 1 : 1 CL1 Berlin Germany 5008 3112
## 2 city liste 1 : 2 CL1 Karlsruhe Germany 2002 2223
## 3 city liste 1 : 3 CL1 Stuttgart Germany 3453 3498
## 4 city liste 1 : 4 CL1 Mannheim Germany 2478 3041
## 5 city liste 1 : 5 CL1 Heidelberg Germany 3811 1003
## 6 city liste 1 : 6 CL1 Frankfurt Germany 1875 3135
## coordinates
## 1 13.38886, 52.51704
## 2 8.40342, 49.00687
## 3 9.180013, 48.778449
## 4 8.467236, 49.489591
## 5 8.694724, 49.409358
## 6 8.682092, 50.110644
Ahora puedo crear el diagrama de dispersión usando la función deckgl del paquete R deckgl.
# define properties of the plot
properties_1 <- list(
getPosition = get_property("coordinates"),
getRadius = JS("data => Math.sqrt(data.exits)"),
radiusScale = 1000,
getColor = c(255, 153, 77)
)
# plot scatterplot
deckgl(zoom = 10.5, pitch = 35, longitude = 8.40342, latitude = 40.00687) %>%
add_scatterplot_layer(data = scatter_data_df_1, properties = properties_1) %>%
add_mapbox_basemap(style = "mapbox://styles/linnartsf/cjq6p9q8f8zwf2rp74qf2o3d5")
Terminamos con el siguiente diagrama de dispersión:
No dude en consultar mis otras publicaciones sobre análisis de datos espaciales y visualización de datos espaciales en R.
Ingeniero industrial especializado en optimización y simulación (R, Python, SQL, VBA)
Leave a Reply