이 게시물에서는 R의 ggplot2 패키지를 사용하여 공간 위치를지도 타일에 그리는 방법을 보여주고 싶습니다.
이를 위해 먼저 관련 패키지를로드합니다. 또한 Open Street Map API를 사용하여 지오 코딩 기능을 정의합니다. 지오 코딩 기능은 https://datascienceplus.com/osm-nominatim-with-r-getting-locations-geo-coordinates-by-its-address/에서 얻었습니다.
다음 단계에서는 ggplot2 패키지의 map_data 함수를 사용하여 플로팅에 적합한 데이터 프레임 형태로지도를 수집합니다. 그런 다음 수동으로 도시 이름 목록을 만들고 지오 코딩 기능을 사용하여 이러한 도시 이름을 좌표로 변환합니다.
ggplot2 및 ggplot2를 사용하여 지오 코딩 된 데이터 포인트가 세계지도에 시각화됩니다.
# 관련 라이브러리 가져 오기
library(ggplot2)
library(ggrepel)
# osm 지오 코더
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)))
}
# 핵심 부품
# 데이터 준비
world <- map_data("world")
points_df <- data.frame(matrix(nrow=0,ncol=2))
colnames(points_df) <- c("long","lat")
city_list <- c("New York City, New York, USA",
"Detroit, Michigan, USA",
"Atlanta, Georgia, USA",
"Birmingham, Alabama, USA",
"Miami, Florida, USA",
"Nashville, Tennessee, USA",
"Knoxville, Tennessee, USA")
for(i in city_list){
dum_coord <- osm_geocoder(i)
points_df <- rbind(points_df,data.frame("long"=c(as.numeric(dum_coord[1])),"lat"=c(as.numeric(dum_coord[2]))))
}
gg_1 <- ggplot(world) +
geom_polygon(mapping=aes(x=long,y=lat, group=group),fill="white",colour="black")
gg_dots <- gg_1 + geom_point(data=points_df,mapping=aes(x=long, y=lat),colour="red",size=3)
gg_text <- gg_dots + geom_text_repel(data=data.frame("long"=points_df$long,"lat"=points_df$lat,"city"=city_list),
mapping=aes(x=long,y=lat,label=c("New York",
"Detroit",
"Atlanta",
"Birmingham",
"Miami",
"Nashville",
"Knoxville")),
color="blue",
size=6)
# 플롯 출력
gg_text
이 게시물이 흥미 로웠다면 deckgl, ggmap 및 Leaflet과 같은 패키지를 사용하여 R의 공간 데이터 시각화에 대한 다른 블로그 항목을 확인하고 싶을 것입니다.
최적화 및 시뮬레이션을 전문으로하는 산업 엔지니어 (R, Python, SQL, VBA)
Leave a Reply