2019년 1월 21일 월요일

[R shiny] interactive mapping 그림 만들기

 "Rshiny에서 interactive mapping 그림을 만들기 위해서는 leaflet 패키지를 이용해야 한다. leaflet 패키지를 미리 설치하자.

install.packages("leaflet")
 "server.R 코드는 아래와 같다. 처음에 leaflet을 이용하기 위한 renderLeaflet({ }) 틀을 만든다. renderLeaflet가 아닌 다른 틀을 쓴다면 오류가 발생한다.

 연습 데이터를 만들기 위해 sample 함수를 이용하여 127,127.1,127.2 ~ 128.8,128.9,129 사이에서 100개의 경도를 중복을 허용하여 랜덤으로 발생시키고 위도도 sample 함수를 이용하여 35,35.1,35.2 ~ 36.8,36.9,37 사이에서 100개를 발생시켰다. 또한, 1~100 사이에서 value 값을 랜덤으로 발생시켰다. 랜덤으로 발생시킨 세개의 변수를 이용하여 data라는 데이터를 생성하였다.

 그 다음 leaflet 함수를 이용하여 맵에 조건을 하나씩 넣으면 된다. leaflet(데이터)를 쓴뒤 %>%을 적는다. 조건을 추가할 때마다 %>% 적는 것을 까먹으면 안된다.

 setView으로 맵이 그려질 때 출력되어질 처음 위치를 적어야하는데 setView(lng=경도,lat=위도,zoom=확대 정도)이므로 경도 위도로 위치를 정하고 zoom 정도를 조절하면 된다.

 addProviderTiles는 그림의 형식을 바꿀 수 있는 함수이다. 이 함수를 쓰지 않으면 해안선에 보라색이 있는 그림이 출력되지만addProviderTiles(providers$CartoDB.Positron)를 추가해주면 보라색 해안선이 없는 간단한 그림이 출력된다. names(providers)을 하면 여러가지 그림 형식이 나오니 취향에 맞게 쓰면된다.

 다음으로 이용한 함수는 addCircles인데 위경도 위치를 표현하는 표시를 원으로 바꿔준다. addCircles(lng=경도,lat=위도,popup=원클릭시 출력되는 문자,radius=원의 크기,fillColor=원의 색깔,stroke=원 테두리 출력 여부, fillOpacity=원 안 색깔의 투명도 정도)로 구성되어 있다. popup에 위치의 값을 출력하고 싶을 때 숫자만 넣으면 출력이 안되니 as.character로 숫자를 문자로 바꿔야한다.

 마지막으로 addLegend는 그림에서 처럼 설명을 넣을 수 있는 기능이다. addLegend(위치,colors=색,title=legend 이름,labels=레전드 설명)으로 구성된다.


library(shiny)
library(leaflet)

server <- function(input,output, session){
  
  output$map <- renderLeaflet({
    
    data<-data.frame(longitude=sample(seq(127,129,0.1),100,replace=T),latitude=sample(seq(35,38,0.1),100,replace=T),value=sample(1:100,100,replace=T))
    
    m <- leaflet(data=data) %>%
         setView(lng=128, lat=37 , zoom=6) %>%
         addProviderTiles(providers$CartoDB.Positron) %>%
         addCircles(lng=data$longitude,lat=data$latitude,popup=as.character(data$value),radius=data$value*100,fillColor="blue",stroke=FALSE,fillOpacity=0.4) %>%
         addLegend("bottomleft",colors="blue",title="Color",labels=c(">1000"))
    
  })
  
}
 ui.R 코드는 아래와 같다. server에서 생성한 leaflet 그림을 출력하기 위해서 leafletOutput(server에 생성한 그림의 이름,width=넓이 값,height=높이값) 함수를 이용하면 interative mapping 그림을 만들 수 있다.


library(shiny)
library(leaflet)

ui <- fluidPage(
  
  leafletOutput("map",height = 800)
  
)
https://inziwiduk.shinyapps.io/VoMd/에 들어가면 interactive mapping을 응용하여 만든 R shiny를 확인해볼 수 있다.

0 개의 댓글:

댓글 쓰기