Kortbaserede scatter plots med deckgl i R

I dette blogindlæg giver jeg et kodningseksempel i R for, hvordan man opretter et kortbaseret scatterplot ved hjælp af deckgl-pakken. Dette kan være nyttigt, når du visualiserer data med et eller andet rumligt aspekt. For eksempel vil du måske visualisere den geospatiale fordeling af visse egenskabsklynger.

Før jeg kan anvende deckgl-pakkens funktionalitet, har jeg brug for et geokodet datasæt, dvs. et datasæt som indeholder information om længde- og breddegradskoordinater for egenskaben af ​​interesse. Til dette vil jeg bruge en geokodningsfunktion, der anvender Open Street Map API. Jeg fandt funktionen på 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)))
}

Dernæst skal jeg initialisere de data, jeg vil plotte. Jeg gemte en liste over byer i en separat csv-fil. Jeg læser således denne fil ind og konverterer den til en dataramme. Jeg bruger så geokodningsfunktionen til at geokode alle byerne i min dataramme. Derudover tilføjer jeg normalfordelte værdier til kolonnen “indgange” og “udgange”. nødvendig for at bestemme fx cirkeldesign i scatterplotten.

# 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

Jeg kan nu oprette scatterplot ved hjælp af deckgl-funktionen fra deckgl R-pakken.

# 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")

Vi ender med følgende scatterplot:

Simpelt scatterplot på mapbox-fliser, oprettet ved hjælp af Mapbox og deckgl R-pakken

Du er velkommen til at tjekke mine andre indlæg om rumlig dataanalyse og rumlig datavisualisering i R.

You May Also Like

Leave a Reply

Leave a Reply

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *

This site uses Akismet to reduce spam. Learn how your comment data is processed.