이 블로그 게시물에서는 Deckgl 패키지를 사용하여 맵 기반 산점도를 만드는 방법에 대한 R 코딩 예제를 제공합니다. 이는 일부 공간적 측면으로 데이터를 시각화할 때 유용할 수 있습니다. 예를 들어 특정 속성 클러스터의 지리 공간적 분포를 시각화할 수 있습니다.
Deckgl 패키지의 기능을 적용하기 전에 지오코딩된 데이터 세트, 즉 관심 속성의 경도 및 위도 좌표에 대한 정보가 포함된 데이터 세트가 필요합니다. 이를 위해 Open Street Map API를 적용한 지오코딩 기능을 사용하겠습니다. 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)))
}
다음으로 플롯하려는 데이터를 초기화해야 합니다. 별도의 csv 파일에 도시 목록을 저장했습니다. 따라서 이 파일을 읽고 데이터 프레임으로 변환합니다. 그런 다음 지오코딩 기능을 사용하여 내 데이터 프레임의 모든 도시를 지오코딩합니다. 또한 “entries” 및 “exits” 열에 정규 분포된 값을 추가합니다. 예를 들어 산점도에서 원 디자인을 결정하는 데 필요합니다.
# 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
이제 deckgl 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")
우리는 다음과 같은 산점도로 끝납니다.
R에서 공간 데이터 분석 및 공간 데이터 시각화에 대한 다른 게시물을 확인하십시오.
최적화 및 시뮬레이션을 전문으로하는 산업 엔지니어 (R, Python, SQL, VBA)
Leave a Reply