새소식

R/plotly

R | plotly | Interactive Map(1) - 지도 시각화(점, 밀도)

  • -

 

 

이전 ggmap을 사용한 지도 시각화에서는

ggplot2 패키지와 ggmap 패키지를 사용해 scatter와 density를 지도 위에 시각화하였다. 

이번 포스팅에서는 plotly 패키지를 사용하여 지도 시각화를 진행해 볼 것이다. 

 

https://boring9.tistory.com/20

 

R | ggmap | 지도 시각화(1)

R에서는 지도 시각화를 위한 'ggmap' 패키지를 제공한다. Google map에서 지도 그림을 가져와 조각조각 붙인다. 이를 위해서는 위도, 경도 좌표값이 꼭 필요하다. 참고로 예전에는 구글맵 api를 등록하

boring9.tistory.com

plotly_map1_scatter_density.html
5.09MB


 

00. 패키지 로드 

## 패키지 로드 
library(dplyr)
library(plotly)

library(showtext)
### 한글 폰트 설정 
font_add_google("Nanum Gothic", "nanumgothic")

 

 


 

01. 간단한 지도 불러오기 

 

·OpenStreetMap 사용 

·대전광역시의 지도 시각화 하기 

 

· mapbox style(Token이 필요하지 않음)

   : open-street-map, carto-positron, carto-darkmatter, stamen-terrain, stamen-toner or stamen-watercolor

 

1) Open-street-map

 

- plot_ly() 함수로 지도를 시각화 하기 위해서는 type 속성에 'scattermapbox'나 다른 지도 type을 지정해 준 후,

   layout의 mapbox 속성을 사용해 style = 'open-street-map', 

   center 속성을 사용해 지도로 표현하고 싶은 위치의 중심좌표를 매핑한다.

   zoom을 사용해서 지도를 확대, 축소할 수 있다. 

plot_ly(type = 'scattermapbox') %>% 
   layout(mapbox=list(style='open-street-map',
                      center=list(lat=36.36, lon=127.38),
                      zoom=10))

 

 

 2) carto-positron

 

- style = 'carto-position'

plot_ly(type='scattermapbox') %>% 
   layout(mapbox=list(style='carto-positron',
                      center=list(lat=36.36, lon=127.38),
                      zoom=10))

 

 

 

3)  stamen-terrain

 

- style = 'stamen-terrain'

plot_ly(type='scattermapbox') %>% 
   layout(mapbox=list(style='stamen-terrain',
                      center=list(lat=36.36, lon=127.38),
                      zoom=10))

 

 

 


 

02. 공공데이터를 활용한 지도 시각화 

 

1)  소상공인시장진흥공단_상가(상권)정보

 

: 영업 중인 전국 상가업소 데이터를 제공
(상호명, 업종코드, 업종명, 지번주소, 도로명주소, 경도, 위도 등)

https://www.data.go.kr/data/15083033/fileData.do

 

소상공인시장진흥공단_상가(상권)정보_20220930

<br/>영업 중인 전국 상가업소 데이터를 제공합니다. <br/>(상호명, 업종코드, 업종명, 지번주소, 도로명주소, 경도, 위도 등)

www.data.go.kr

 

2) 파일 불러오기 및 데이터 추출 

 

소상공인시장진흥공단_상가(상권) 정보_대전_202209.csv 파일 사용 

data.file <- read.csv(file.choose(), fileEncoding = "utf-8")
data.raw<- data.file
data.raw %>% head()
data.raw %>% summary()
data.raw %>% dim()
data.raw %>% str()

data.raw %>% select(상호명, 상권업종대분류명,도로명주소, 경도, 위도)

 

 

- 자료 추출 : 상권업종소분류명=='커피전문점/카페/다방'인 행만 추출

data.cafe <- data.raw %>% filter(상권업종소분류명=='커피전문점/카페/다방')
data.cafe %>% head()

 

 

 

3)  카페 위치를 지도 위에 점(scattermapbox)으로 표시 

 

· 지도 위에 위치를 점으로 표시하기 위해서는 위경도가 있는 데이터를 매핑한 후,

   lat에 위도 정보가 있는 열을 매핑, lon에 경도 정도가 있는 열을 매핑하고, 

   mode = "markers", type = "scattermapbox"로  지정하면 된다. 

 

## open-street-map 맵 사용
plot_ly(data.cafe, lat=~위도, lon=~경도) %>% 
  add_trace(split=~시군구명,
            mode='markers', 
            type= "scattermapbox",
            hoverinfo = 'name+text',
            hovertext=~상호명) %>% 
  layout(mapbox=list(style='open-street-map',
                     center=list(lat=36.36, lon=127.38),
                     zoom=10))

 

 

 

4)  카페 분포를 지도 위에 밀도(densitymapbox)로 표현

 

- 지도 위에 밀도를 표현하기 위해서는 type = 'densitymapbox'로 지정해 주면 된다. 

plot_ly(data.cafe, lat=~위도, lon=~경도) %>% 
  add_trace(type= "densitymapbox") %>% 
  layout(mapbox=list(style='open-street-map',
                     center=list(lat=36.36, lon=127.38),
                     zoom=10))

 

 

 

radius가 기본값이 30이므로 위의 그래프처럼 카페 위경도 중심으로 반경이 넓게 표현된다. 따라서 더 정확한 밀도를 보기 위해서는

    radius를 적절히 조절해야 한다.

 

- 또한, 축의 색상을 변경하기 위해서는 coloraxis = "coloraxis"를 지정하고, layout에서 colorscale를 지정하면 된다. 

plot_ly(data.cafe, lat=~위도, lon=~경도) %>% 
  add_trace(
            type= "densitymapbox",
            coloraxis = "coloraxis", # 축 색깔 설정,
            radius = 10, # 밀도로 표현할 반경 지정
            opacity = 0.5) %>% 
  layout(mapbox=list(style='open-street-map',
                     center=list(lat=36.36, lon=127.38),
                     zoom=10),
         coloraxis = list(colorscale = 'Viridis')) # 축 색깔 팔레트 지정

 

 

 

 

 

 

 

 

 

 

 

 

 


참고 문헌(reference)

Contents