--- GA: UA-159972578-2 --- ###### tags: `R` `leaflet` `Visualization` `Report` `資料視覺化` View Rpubs note on <i class="fa fa-book fa-fw"></i> [Leaflet套件介紹與範例](https://rpubs.com/RitaTang/leaflet) (多層互動地圖) View another note on <i class="fa fa-book fa-fw"></i> [Leaflet Mini Chart](http://ba.cm.nsysu.edu.tw:4950/tonychuo/PwrProd.Rmd?fbclid=IwAR2AKQfFkFb_-j2v7iJ1MANUWdNt7AH8HtMan6P_KNVUfKy7YWS0nvwfjkw) (ShinyApp) Reference: [Leaflet Github](http://rstudio.github.io/leaflet/) # Leaflet功能介紹 + Tiles: 選擇想要的世界地圖當底圖 + Marker: 在地圖標上記號 + 設定經緯度 + popup: 點擊Marker(`r icon::fa_map_marker_alt(color="#F4D03F",size=1)`)觸發彈出視窗 + 以html格式呈現 + label: 感應游標後顯示標籤 + icon: + [Font Awesome](http://fontawesome.io/icons/) + [Bootstrap Glyphicons](https://getbootstrap.com/components/) + [Ion icons](http://ionicons.com/) ```{r eval=FALSE} 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會展開 ``` # 範例 ## 讀取資料 ```{r warning=FALSE, message=FALSE, cache=FALSE, error=FALSE} options(digits=4, scipen=40) library(dplyr) library(leaflet) load("Biz.rdata") # 巴西電商資料 # 188,593 obs. ``` ## 設定地圖範圍及經緯度 ### 探索資料 ```{r} table(B$city) %>% sort %>% tail(8) # 前八大城市 ``` ```{r} rbind(range(B$latitude, na.rm=T), range(B$longitude, na.rm=T)) # 經緯度界線 ``` ### 選擇資料筆數最多的Las Vegas做地圖 ```{r} B = subset(B, city == "Las Vegas" & !is.na(address) & state == "NV" & B$latitude > 0 & B$longitude > -115.5 & B$longitude < -115) # 28,781 obs. ``` ## 製作popup ```{r} 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] ``` ![](https://i.imgur.com/fUO4MaL.png) ## 依據評論數切割資料集 ```{r} B$review_count %>% cut(c(0,5,10,50,100,200,400,9999)) %>% table # 評論數 B$rank = cut(B$review_count, c(0,5,10,50,100,200,400,9999)) # 評論數屬於哪一個cut bx = split(B, B$rank) # 依照評論數的分級切割資料集, 改以list儲存 ``` ## 對每個分割製作地圖物件 ```{r} 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')) }) ``` ## 繪製互動地圖 ```{r} library(knitr) l %>% addLayersControl( # 使用lapply寫法的話,呼叫要指定最後一層: z[[7]] overlayGroups = names(bx), options = layersControlOptions(collapsed = FALSE) ) ``` ![](https://i.imgur.com/ZDglf99.jpg) [You can interact with the map in here](https://rpubs.com/RitaTang/leaflet) + addWebGLHeatmap 可以做出熱圖 + ~htmlEscape() 防止html的語法跑掉 # Leaflet Extra套件 ```{r} library(leaflet.extra) df %>% leaflet()%>% addTiles()%>% addMarkers(label=~Name)%>% setView(lng=lng,lat=lat, zoom = 6) %>% addSearchOSM() %>% addReverseSearchOSM() ``` + addSearchOSM() 打關鍵字就能搜尋其所在位置(類似googlemap的搜尋功能) ![](https://i.imgur.com/upqNdzP.png) + addReverseSearchOSM() 點擊地圖後回傳的點擊區域的經緯度 ![](https://i.imgur.com/REnszLf.png)