這裡介紹如何在 R 中使用 Leaflet 繪製互動式的地圖,並將資料呈現在地圖上。
Leaflet 是一套相當熱門的網頁互動式地圖繪製工具,在 R 中我們也可以利用這套工具來繪製地圖,並將各種資料標示在地圖上,讓使用者以互動式的方式瀏覽資料。
R 的 leaflet 套件讓使用者在 R 的環境中(標準 R 執行環境或 RStudio)直接畫出網頁互動式的地圖,使用者可以使用滑鼠操作地圖(放大、移動等),另外 Leaflet 的地圖也可以內坎在 R Markdown 文件或 Shiny 應用程式中,與既有的文件或應用程式整合在一起。
R 的 leaflet 套件已經被收錄在官方的 CRAN 網站上,在 R 中使用 install.packages
即可安裝:
install.packages("leaflet")
接著載入 leaflet
套件,即可開始使用:
library(leaflet)
leaflet
可以配合 magrittr
的 %>%
管線運算子使用:
map <- leaflet() %>% addTiles() %>% # 加上預設的地圖資料 addMarkers(lng=120.239, lat=22.992, popup="訊息方塊的文字說明") map # 繪製地圖
若不熟悉 magrittr
的 %>%
管線運算子語法,也可以使用傳統的 R 語法,兩種寫法功能都一樣:
map <- leaflet() map <- addTiles(map) map <- addMarkers(map, lng=120.239, lat=22.992, popup="訊息方塊的文字說明") map
leaflet
函數會傳回一個 Leaflet 的地圖物件(map widget object),此物件中儲存了許多地圖繪製的相關資訊,可於後續持續修改與更新,而大部分的 leaflet
套件中的函數,第一個參數都是指定地圖物件,因此可以非常容易與 magrittr
的管線運算子配合使用。
在建立 Leaflet 地圖物件之後,可以利用以下幾個函數來修改地圖物件的屬性:
函數名稱 | 說明 |
---|---|
setView |
設定地圖的中心座標位置以及縮放比例。 |
fitBounds |
設定地圖的位置與縮放比例,讓畫面剛好可呈現指定的方形區域。 |
clearBounds |
清除指定的方形區域,顯示最大的區域(全球地圖)。 |
以下示範這幾個函數的使用方式,通常在建立地圖時都會使用 setView
設定地圖的位置與縮放比例:
m <- leaflet() %>% addTiles() %>% setView(-71.0382679, 42.3489054, zoom = 18) m
若要顯示特定的矩形區域,則可使用 fitBounds
來變更地圖的顯示區域:
m %>% fitBounds(-72, 40, -70, 43)
清除了指定的方形區域之後,就會顯示最大的區域,亦即全球地圖:
m %>% clearBounds()
leaflet
與各種地圖圖層函數都有一個 data
參數,可用來指定空間資料(spatial data)的來源,其可接受的資料格式有很多種:
類型 | 資料格式 |
---|---|
基本類型 | 包含經緯度的 R 矩陣 |
包含經緯度的 data frame | |
sp 套件 | SpatialPoints[DataFrame] |
Line /Lines |
|
SpatialLines[DataFrame] |
|
Polygon /Polygons |
|
SpatialPolygons[DataFrame] |
|
maps 套件 | 由 map 函數所產生的 data frame |
當資料來源為一般的 data frame 時,leaflet 會自動尋找 data frame 中名稱類似 lng
、longitude
與 lat
、latitude
作為經緯度座標,以下是一個以圓圈標示資料的範例:
set.seed(3) point.df <- data.frame( Lat = 22.992 + rnorm(10)/800, Long = 120.239 + rnorm(10)/800 ) m <- leaflet(point.df) %>% addTiles() %>% setView(lng = 120.239, lat = 22.992, zoom = 17) m %>% addCircles()
亦可使用公式的方式明確指定經緯度座標的變數名稱:
m %>% addCircles(lng = ~Long, lat = ~Lat)
也可以針對特定的圖層個別指定不同的資料來源:
m <- leaflet() %>% addTiles() %>% setView(lng = 120.239, lat = 22.992, zoom = 17) m %>% addCircles(data = point.df, lng = ~Long, lat = ~Lat)
關於 sp
與 maps
套件的資料來源範例,可參考 R Leaflet 套件官方網站的範例。
leaflet 套件中所有圖層函數的參數都可以接受一般的 R 向量(例如以數值向量指定經緯度等),也可以使用單邊的公式指定 data
資料來源中的變數,例如 ~ x
就是指 data
中的 x
變數,另外也可以結合各種的數學轉換,例如 ~ sqrt(x + 1)
。
以下是一個使用公式的範例:
set.seed(3) point.df <- data.frame( lat = 22.97 + rnorm(100)/800, long = 120.23 + rnorm(100)/800, size = runif(100, 5, 20), color = sample(colors(), 100) ) m <- leaflet(point.df) %>% addTiles() %>% setView(lng = 120.23, lat = 22.97, zoom = 17) m %>% addCircleMarkers(radius = ~size, color = ~color, fill = FALSE)
這是使用一般 R 向量的例子:
m %>% addCircleMarkers(radius = runif(100, 4, 10), color = c('red'))