Reference: Leaflet Github

1 Leaflet功能介紹

leaflet() %>%  # 製作繪圖面板
  setView(lng, lat, zoom) %>%  # 設定視窗範圍 # 以該點放大多少倍
  addTiles() %>%               # 加上底圖
  addMarkers(~lng, ~lat, ~popup, ~label, # 在哪個點上標記號 # 如果不設定經緯度會自己找變數
             icon, clusterOptions = markerClusterOptions()) %>% # 把Marker做Clusters
#### Optional ####
  # 選擇地圖樣式
  addProviderTiles(providers$Stamen.Toner, group = "Toner") %>% 
  # 用範圍圓圈標示
  addCircleMarkers(lng, lat, weight, radius, popup) %>%  # 邊框粗細 # 半徑
  # 使用套件的icon # 替代addMarkers()
  addAwesomeMarkers(lng, lat, icon = awesomeIcons(icon = 'ios-close',
                                                  iconColor = 'black',
                                                  library = 'ion',
                                                  markerColor = getColor(df.20)
                                                 )) %>% 
  # 替代addMarkers(popup)
  addPopups(lng, lat, content, options = popupOptions(closeButton = FALSE)) %>% 
  # 製作Legend
  addLegend("bottomright", pal = colorNumeric(), values, title, opacity = 1) %>% # 調色盤 # 不透明度
  # 製作控制面板
  addLayersControl(
    baseGroups = c("A地圖樣式", "B地圖樣式", "C地圖樣式"), # 前面要設定addTiles(group)和addProviderTiles才可用
    overlayGroups = c("a族群的點", "b族群的點"),
    options = layersControlOptions(collapsed = FALSE)) # 要不要展開layer control # 設F會展開

2 範例

2.1 讀取資料

options(digits=4, scipen=40)
library(dplyr)
library(leaflet)
load("Biz.rdata") # Yelp店家資料 # 188,593 obs. # 80 variables
str(B[,c(1:10)])  # 查看前10個變數
## 'data.frame':    188593 obs. of  10 variables:
##  $ bid         : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ name        : chr  "SpinalWorks Chiropractic" "Montallegro Barber Shop" "Custom Kings" "Instant Muffler and Autorepair" ...
##  $ is_open     : num  1 1 1 1 1 1 0 1 0 1 ...
##  $ review_count: num  36 16 17 3 4 81 75 14 20 5 ...
##  $ stars       : num  5 5 1.5 1 4 3 3 3 3 4 ...
##  $ state       : chr  "AZ" "QC" "NV" "ON" ...
##  $ postal_code : chr  "85022" "H3N 1Z1" "88901" "M6M 4R2" ...
##  $ latitude    : num  33.6 45.5 36.1 43.7 33.4 ...
##  $ longitude   : num  -112.1 -73.6 -115.2 -79.5 -111.9 ...
##  $ city        : chr  "Phoenix" "Montreal" "Las Vegas" "York" ...

2.2 設定地圖範圍及經緯度

2.2.1 探索資料

table(B$city) %>% sort %>% tail(8) # 前八大城市
## 
##       Mesa Pittsburgh    Calgary Scottsdale  Charlotte    Toronto    Phoenix 
##       6239       6804       7384       8822       9204      18233      18633 
##  Las Vegas 
##      28865
rbind(range(B$latitude, na.rm=T), range(B$longitude, na.rm=T)) # 經緯度界線
##         [,1]   [,2]
## [1,]  -71.75  85.05
## [2,] -180.00 115.09

2.2.2 選擇資料筆數最多的Las Vegas做地圖

B = subset(B, city == "Las Vegas" & !is.na(address) & state == "NV" &  
             B$latitude > 0 & B$longitude > -115.5 & B$longitude < -115) # 28,781 obs.

2.3 製作popup

url = "'http://cm.nsysu.edu.tw/~msrc/wp/'"
B$popup = paste(
  sep="<br/>", # 以<br/>換行符號作為分隔
  sprintf("<b><a href=%s>%s</a></b>",url,B$name), # %s: string # 等於:paste0("b><a href=",url,">",B$name,"</a></b>")
  sprintf("Stars:%.1f, Reviews:%d",B$stars,B$review_count), # %.1f: 指定浮點數輸出至小數點以下第一位 # %d: 印整數
  # sprintf("lat:%.2f, lon:%.2f",B$latitude,B$longitude),
  B$address)
B$popup[23677]
## [1] "<b><a href='http://cm.nsysu.edu.tw/~msrc/wp/'>The Resort On Mt Charleston</a></b><br/>Stars:2.5, Reviews:250<br/>2275 Kyle Canyon Rd"

呈現效果

2.4 依據評論數切割資料集

B$review_count %>% cut(c(0,5,10,50,100,200,400,9999)) %>% table # 評論數
## .
##       (0,5]      (5,10]     (10,50]    (50,100]   (100,200]   (200,400] 
##        7481        5287        9837        2637        1658        1018 
## (400,1e+04] 
##         863
B$rank = cut(B$review_count, c(0,5,10,50,100,200,400,9999))     # 評論數屬於哪一個cut
bx = split(B, B$rank)  # 依照評論數的分級切割資料集, 改以list儲存

2.5 對每個分割製作地圖物件

l <- leaflet() %>% addTiles() 
# 原始寫法 # 避免使用for loop
names(bx) %>% purrr::walk( function(df) { # 有7個,執行7次
  l <<- l %>% addMarkers(
    data = bx[[df]], lng = ~longitude, lat = ~latitude,
    label = ~name, popup = ~popup, group = df,
    clusterOptions = markerClusterOptions(removeOutsideVisibleBounds=F),
    labelOptions = labelOptions(noHide=F, direction='auto')) 
  })

# for loop寫法(易懂版)
for(i in 1:length(bx)){ 
  l = l %>% addMarkers(
    data = bx[[i]], lng = ~longitude, lat = ~latitude,
    label = ~name, popup = ~popup, group = names(bx)[i],
    clusterOptions = markerClusterOptions(removeOutsideVisibleBounds=F), 
    labelOptions = labelOptions(noHide=F, direction='auto')) 
}

# lapply寫法
z = lapply(1:length(bx), function(i){
  l = l %>% addMarkers(
    data = bx[[i]], lng = ~longitude, lat = ~latitude,
    label = ~name, popup = ~popup, group = names(bx)[i],
    clusterOptions = markerClusterOptions(removeOutsideVisibleBounds=F), 
    labelOptions = labelOptions(noHide=F, direction='auto')) 
})

2.6 繪製互動地圖

library(knitr)
l %>% addLayersControl(      # 使用lapply寫法的話,呼叫要指定最後一層: z[[7]]
  overlayGroups = names(bx), 
  options = layersControlOptions(collapsed = FALSE) )