這裡介紹如何在 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  # 繪製地圖
r-leaflet-interactive-map-package-tutorial-1

RStudio 使用 Leftlet 繪製地圖

若不熟悉 magrittr%>% 管線運算子語法,也可以使用傳統的 R 語法,兩種寫法功能都一樣:

map <- leaflet()
map <- addTiles(map)
map <- addMarkers(map, lng=120.239, lat=22.992, popup="訊息方塊的文字說明")
map

Leaflet 地圖物件

leaflet 函數會傳回一個 Leaflet 的地圖物件(map widget object),此物件中儲存了許多地圖繪製的相關資訊,可於後續持續修改與更新,而大部分的 leaflet 套件中的函數,第一個參數都是指定地圖物件,因此可以非常容易與 magrittr 的管線運算子配合使用。

地圖屬性

在建立 Leaflet 地圖物件之後,可以利用以下幾個函數來修改地圖物件的屬性:

函數名稱 說明
setView 設定地圖的中心座標位置以及縮放比例。
fitBounds 設定地圖的位置與縮放比例,讓畫面剛好可呈現指定的方形區域。
clearBounds 清除指定的方形區域,顯示最大的區域(全球地圖)。

以下示範這幾個函數的使用方式,通常在建立地圖時都會使用 setView 設定地圖的位置與縮放比例:

m <- leaflet() %>%
  addTiles() %>%
  setView(-71.0382679, 42.3489054, zoom = 18)
m
r-leaflet-interactive-map-package-tutorial-2

setView 設定地圖顯示區域

若要顯示特定的矩形區域,則可使用 fitBounds 來變更地圖的顯示區域:

m %>% fitBounds(-72, 40, -70, 43)
r-leaflet-interactive-map-package-tutorial-3

fitBounds 變更地圖的顯示區域

清除了指定的方形區域之後,就會顯示最大的區域,亦即全球地圖:

m %>% clearBounds()
r-leaflet-interactive-map-package-tutorial-4

全球地圖

資料來源

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 中名稱類似 lnglongitudelatlatitude 作為經緯度座標,以下是一個以圓圈標示資料的範例:

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()
r-leaflet-interactive-map-package-tutorial-5

以圓圈標示資料

亦可使用公式的方式明確指定經緯度座標的變數名稱:

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)

關於 spmaps 套件的資料來源範例,可參考 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-leaflet-interactive-map-package-tutorial-6

以圓圈標示資料

這是使用一般 R 向量的例子:

m %>% addCircleMarkers(radius = runif(100, 4, 10), color = c('red'))
r-leaflet-interactive-map-package-tutorial-7

以圓圈標示資料