Gráficos de dispersão com deckgl em R

Nesta postagem do blog, forneço um exemplo de codificação em R para saber como criar um gráfico de dispersão baseado em mapa usando o pacote deckgl. Isso pode ser útil ao visualizar dados com algum aspecto espacial. Por exemplo, você pode querer visualizar a distribuição geoespacial de certos clusters de propriedade.

Antes de aplicar a funcionalidade do pacote deckgl, preciso de um conjunto de dados geocodificados, ou seja, um conjunto de dados que contenha informações sobre as coordenadas de longitude e latitude da propriedade de interesse. Para isso, usarei uma função de geocodificação aplicando a API Open Street Map. Encontrei a função em 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)))
}

Em seguida, preciso inicializar os dados que desejo plotar. Eu armazenei uma lista de cidades em um arquivo csv separado. Assim, leio este arquivo e o converto em um dataframe. Em seguida, uso a função de geocodificação para geocodificar todas as cidades em meu quadro de dados. Além disso, adiciono valores normalmente distribuídos às colunas “entradas” e “saídas”; necessário para determinar, por exemplo, o desenho do círculo no gráfico de dispersão.

# 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

Agora posso criar o gráfico de dispersão, usando a função deckgl do pacote deckgl R.

# 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 com o seguinte gráfico de dispersão:

Gráfico de dispersão simples em blocos de mapbox, criados usando Mapbox e o pacote deckgl R

Sinta-se à vontade para conferir minhas outras postagens sobre análise de dados espaciais e visualização de dados espaciais em R.

You May Also Like

Leave a Reply

Leave a Reply

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.