[R語言專題]用ggplot畫地圖 – 基礎篇

3

Last Updated on 2023-12-19

Home » R語言教學 » R語言專題 » [R語言專題]用ggplot畫地圖 – 基礎篇

怎麼用R語言繪製地圖?畫出台灣或者台北市地圖,有什麼要注意的事情?本文利用ggplot2和sf帶你畫地圖。

這篇文章介紹R語言當中的套件sf以及ggplot2,還有相應的空間與地理資料型態、資料格式、資料結構,帶你一步步用R語言畫出精美地圖。

用 R 語言畫地圖 – 架構

地圖(map)是一種用來呈現地理空間資料的視覺化方法,用來呈現地點、區域或是其他地理相關的資訊。

當我們想看台北市7-11的歷史發展的時候,當然可以觀察營收變化、毛利率結構,但是如果有一張地圖比較1990年和2020年的展店變化,就能清楚讓讀者知道,喔!原來7-11帝國就是如此擴張的。

畫地圖的基礎元素通常包括非笛卡爾體系的座標軸(non Cartesian coordinate system,笛卡爾體系就是我們平常常見的正交座標系,跟地理不一樣)、圖上標籤與圖例等。

我們通常將經度(longitude)和緯度(latitude)作為x軸和y軸,並且在地圖上附加其他資料層,比如用圓點呈現(heatmap),或是在地標上加上標記(marker)表示特定事件發生。

美國大選扭曲地圖

想要繪製出地圖,除了理解R語言的套件與程式碼以外,其實更需要先增加對地理資訊系統(geographic information system,簡稱GIS)的理解,架構包含認識地理資訊原始格式(format)、R語言裡面的地理資料結構(data structure)、操作地理資料(geometry operations)、視覺化地理資料等。

在知道怎麼畫出一張地圖以外,還得補充基礎的地理學概念與知識,例如投影系統(projection system)、座標系統(coordinate system)、縮放比例(scale)、分區(zoning)、等高線(contour lines)、圖層(layers)等。

另外,除了最常見一般的地圖以外,其實我們還有多種圖表可以選擇,例如面量圖/統計地圖(Choropleth)、點示地圖(dot distribution map)、變形地圖(Cartogram)、六角地圖(hexmap)、國會席次圖(parliament plots)等多種選項。

我們會將文章分成幾個部分:

認識空間資料型態、認識空間資料格式、認識空間資料結構、實際繪製地圖。

一般地圖 – 端傳媒

在 R 語言中,你可以使用 ggplot2 的擴展套件 ggmap 或是專門用於地理空間數據處理的 sf 和 leaflet 套件來輕鬆地繪製地圖。這些套件提供了豐富的函數和工具,讓你能一步一步實作出精緻的地圖。

認識空間資料型態:向量與網格

最主要的空間資料型態分別是向量(vector)與網格(raster)。

先來看兩張示意圖,你就能看懂向量與網格的差異了。

向量與網格差異
向量與網格差異之二

用小朋友都能懂的話來說,網格是把現實世界切成一個又一個方格,利用抽象(abstraction)逼近真實世界,向量則試圖百分百的還原真實。我們來看各自的特性吧!

向量(Vector)

  • 描述:向量格式用點(points)、線(lines)和多邊形(polygons)來表示地理特徵。“The vector data model represents the world using points, lines and polygons.”
  • 優點: 精確度高,能夠準確表示複雜的形狀。想想Adobe Illustrator的向量檔案。 能夠緊密結合地理特徵與屬性資料。例如各個縣市的投票人次。 通常所需儲存空間較少。
  • 缺點: 當資料很大、很複雜時,處理速度可能較慢。 不善於應對高度與溫度等連續變數。

網格(Raster)

  • 描述:網格利用網格系統(grid system)表示空間資料,每個格子都是一個基本的地理單位。“The raster data model divides the surface up into cells of constant size.”
  • 優點: 計算效率高,適合進行大範圍的空間分析。 能夠更容易地表示連續變數。 容易取得衛星影像等遙測資料。
  • 缺點: 精確度受到格子大小的限制。想想地理的比例尺。 可能需要更多的儲存空間。格子越細密能存越多東西。 屬性資料的管理較為複雜。

範例

認識空間資料格式

為什麼要先認識空間資料格式,而非空間資料結構呢?因為後面會花比較大的篇幅介紹空間資料結構,所以把格式拉到前面。

  • xlsx/ods: 可以用 Excel/Google sheet 開啟的檔案格式,長相就是平常可以看到的試算表表格。政府單位常常以 ods 發布資料,台北市民政局的人口統計就是提供 ods
  • csv: comma separated value, 用逗點分隔欄位,是非常常見的檔案格式。無論政府或私人單位都會以 csv 發布資料
  • tif:儲存地理圖像的點陣圖格式,通常資料當中包含經緯度。衛星影像的原始格式即是 tif。
  • shapefile:儲存地理圖資的檔案格式,由 shp, shx, dbf, prj 所組成,分別紀錄了地理參照資料、索引、屬性、投影。通常提供地理圖資時,會提供包含 shp, shx, dbf, prj, 等格式的壓縮檔案。
  • geojson:基於 JSON 儲存地理資訊的檔案格式,內容包含空間範圍和屬性。

ShapefiIe

最常見的地理資訊格式,由 ERSI 發明,當中包含數個檔案。以下就是他的細部組成:

  • .shp: 儲存幾何特徵
  • .shx: 儲存 .shp 當中特徵的 index
  • .dbf: 儲存屬性資訊,像是幾何特徵的名字或變數
  • .prj: 儲存座標系統資訊 (coordinate system information) 這個格式常見到有人創了twitter account
ShapefiIe推特帳號

GeoJSON

使用跟 JSON 類似的原始格式,但設計上有特別考慮在表現出地理特徵以外,也保留 non-spatial 的屬性。

地理特徵包含 points, line strings, polygons, and multi-part collections of these types. 你可以看這篇在R語言中處理GeoJSON資料的教學

GeoJSON長相

認識空間資料結構

知道R語言中空間資料的型態,也認識原始資料的格式,接著我們就能進到空間資料結構了!

我們來看R語言中常見的空間資料結構:Simple Feature 與 raster。

raster

raster (網格資料) 由數個 cells/pixels (格子)所組成,每個格子都代表一個區域,而格子都有自己對應到的值,拿 raster 資料來繪圖時,格子當中值的大小可以表現出不同的顏色或是單色的深淺,藉此表示不同的地理特徵,像是地勢高低或是土地類型。

若對 raster 資料有興趣,Intro to Raster Data in R 有大量的插圖幫助理解。

先呈現R語言中 raster 資料的長相,以及利用 plot() 畫出的圖。

library(tidyverse)
library(raster)
aut <- getData("alt", country = "AUT", mask = TRUE)
aut
#> class      : RasterLayer 
#> dimensions : 336, 948, 318528  (nrow, ncol, ncell)
#> resolution : 0.008333333, 0.008333333  (x, y)
#> extent     : 9.4, 17.3, 46.3, 49.1  (xmin, xmax, ymin, ymax)
#> crs        : +proj=longlat +datum=WGS84 +no_defs 
#> source     : AUT_msk_alt.grd 
#> names      : AUT_msk_alt 
#> values     : 108, 3533  (min, max)
plot(aut)

實際用raster套件畫出的圖像

因為應用學門不同,資料型態也不同,所以這次教學不會使用 library(raster),將會以 library(sf)為主。因為 sf 的程式碼實作很長,底下

simple feature

simple feature,簡稱為 sf,它的長相和 raster 有很大的不同。sf 結合了地理特徵與非地理特性,地理特徵像是點、線、多邊形、點與線的組合、線與線的組合,或者是這幾個元素混合在一起,非地理特徵像是地理區的名稱、編號,或者是其他紀錄了人口數量、行政區類型等的欄位。

可以將 simple feature 想像成幾何圖形加上 data frame,幾何圖形就是前述的point, line string, polygon等,data frame 的內容就是區域的屬性(attribute),只是 dataframe 當中地理特性以 list columns 的形式儲存。

可以參考這篇不簡單的介紹Simple Features for R

simple feature 範例

其實,除了 sf 以外,若上網查詢在 R 中應該如何處理地理資料,會看到很多人使用 library(sp),sp 是另一種常見的空間資料型態,只是與 sp 相比,sf 的資料型態易懂且好操作,譬如說可以直接用 st_join() 串接地理資料,而且生態系完整,像是 sf 物件也支援 tidyverse 底下 library(dplyr) 的操作,再加上清楚易懂的官方教學,讓 library(sf) 逐漸熱門,也因此逐漸取代 sp。

若對 sp 與 sf 有興趣,可以參考 Should I learn sf or sp for spatial R programming? 還有Spatial R – Moving from SP to SF,另外,Geocompuations with R 裡面介紹 sf 的段落也值得一看,書中直接提到 “sf largely supersedes the sp ecosystem.”,因此本文才主要介紹 sf。

實作篇 – 結合sf和ggplot2畫地圖

匯入資料

前面提過,資料格式是電腦裡面一個又一個檔案,所以我們是把原始的shapefile、GeoJSON讀進R裏面,變成sf。

匯入資料的函數為st_read(),有兩個重要參數,分別是dsn(data source name)和layer(layer name),可以用「資料夾」的名字理解dsn,以及檔案名稱來理解layer

空間資料-資料夾長相

以上面的資料夾為例,若我們想匯入台北市的圖資,程式碼要這樣寫:

library(sf)

sf_tpe <-
  st_read(dsn = "data/109年12月行政區人口統計_村里_臺北市_SHP/", layer = "109年12月行政區人口統計_村里", quiet = T) %>%
  # 改編碼
  mutate(across(where(is.character), ~iconv(., from = "BIG5", to = "UTF8")))

sf_tpe
#> Simple feature collection with 7928 features and 12 fields
#> Geometry type: MULTIPOLYGON
#> Dimension:     XY
#> Bounding box:  xmin: -40418.36 ymin: 2422005 xmax: 351690.1 ymax: 2919551
#> CRS:           NA
#> First 10 features:
#>    COUNTY   TOWN VILLAGE COUNTY_ID  TOWN_ID         V_ID VILLAGE_ID H_CNT P_CNT
#> 1  高雄市 林園區  中門里     64000 64000130 64000130-006        006  1130  2871
#> 2  高雄市 林園區  港埔里     64000 64000130 64000130-008        008   823  2040
#> 3  高雄市 旗津區  上竹里     64000 64000100 64000100-010        010  1372  3202
#> 4  高雄市 旗津區  中興里     64000 64000100 64000100-013        013  1065  2858
#> 5  屏東縣 潮州鎮  新榮里     10013 10013020 10013020-003        003   589  1385
#> 6  屏東縣 潮州鎮  新生里     10013 10013020 10013020-004        004   464  1109
#> 7  屏東縣 潮州鎮  光華里     10013 10013020 10013020-005        005  2187  5518
#> 8  屏東縣 潮州鎮  彭城里     10013 10013020 10013020-006        006   329   991
#> 9  屏東縣 潮州鎮  三星里     10013 10013020 10013020-007        007  2455  6437
#> 10 屏東縣 潮州鎮  富春里     10013 10013020 10013020-014        014   512  1353
#>    M_CNT F_CNT INFO_TIME                       geometry
#> 1   1479  1392   109Y12M MULTIPOLYGON (((185730.3 24...
#> 2   1042   998   109Y12M MULTIPOLYGON (((186891 2489...
#> 3   1660  1542   109Y12M MULTIPOLYGON (((177841.5 24...
#> 4   1424  1434   109Y12M MULTIPOLYGON (((177633.5 24...
#> 5    685   700   109Y12M MULTIPOLYGON (((202694 2494...
#> 6    562   547   109Y12M MULTIPOLYGON (((202713.5 24...
#> 7   2729  2789   109Y12M MULTIPOLYGON (((203502.9 24...
#> 8    518   473   109Y12M MULTIPOLYGON (((204497.8 24...
#> 9   3134  3303   109Y12M MULTIPOLYGON (((204655.4 24...
#> 10   674   679   109Y12M MULTIPOLYGON (((202901.1 24...

從匯入後顯示出的資訊可以看到,第一行描述寫著”Simple feature collection with 7928 features and 12 fields”,前面的feature代表共有7928筆資料,後面的fields代表有12個欄位。

接著,Geometry type寫著MULTIPOLYGON,意思是multi加上polygon,也就是多個多邊形,指多邊形的組合。這是什麼意思了,從資料中可以看出,這份資料的單位是里,所以是由多個里拼湊而成的台灣資料,每個里都是一個polygon,拼在一起自然是multipolygon了。

Dimension顧名思義指的是資料的維度,這邊的XY代表兩維,若資料有到三維,就會顯示XYZ。

再往下的Bounding box直翻是邊界框,在這裡就是指這份圖資的地理邊界,或者稱為地圖範圍。你可以想像他是一個四邊形,每個數值分別代表四個點。

最後的CRS代表Coordinate Reference System,也就是座標參考系統,後面的篇章我們會有滿滿的大平台介紹它,這邊先略過不計。

看完這些資訊之後,正式進入我們的資料,可以發現其實就和平常匯入資料一樣,這張表格有包含縣市、鄉鎮市區、村里在內的欄位,最後一個欄位geometry最直得注意,它儲存了地理特徵。

因此,前面縣市鄉鎮市區這些就是我們說的非地理特性,最後一個polygon欄位則是地理特徵

sf_tpe %>% dplyr::select(geometry)
#> Simple feature collection with 7928 features and 0 fields
#> Geometry type: MULTIPOLYGON
#> Dimension:     XY
#> Bounding box:  xmin: -40418.36 ymin: 2422005 xmax: 351690.1 ymax: 2919551
#> CRS:           NA
#> First 10 features:
#>                          geometry
#> 1  MULTIPOLYGON (((185730.3 24...
#> 2  MULTIPOLYGON (((186891 2489...
#> 3  MULTIPOLYGON (((177841.5 24...
#> 4  MULTIPOLYGON (((177633.5 24...
#> 5  MULTIPOLYGON (((202694 2494...
#> 6  MULTIPOLYGON (((202713.5 24...
#> 7  MULTIPOLYGON (((203502.9 24...
#> 8  MULTIPOLYGON (((204497.8 24...
#> 9  MULTIPOLYGON (((204655.4 24...
#> 10 MULTIPOLYGON (((202901.1 24...

若是只選geometry欄位,我們可以看到每一格都是multipolygon,而且後面有很多數字。這邊你可能會產生疑問,為什麼每個都是multipolygon?為什麼不是polygon?答案是因為村里的組成未必只是一個多邊形,它可能由好幾個不相連的多邊形拼湊再一起。

舉例來說,以前地理課學過飛地,兩片屬於同一個國家的領土沒有相連,這是一個例子。第二個例子就簡單得多,假設我們有一份縣市的圖資,以澎湖縣來說,他絕對不可能是polygon!因為實在有太多不相連的離島散落於海上,陸地彼此沒有相連,但卻構成一個澎湖縣,所以一定要用multipolygon,才能好好呈現。

你可能又想問說,飛地或者離島,不是應該是例外嗎?對,這樣說也沒錯,但當例外發生時就要重新設計欄位,這樣很沒效率,所以乾脆用涵蓋一切狀況的multipolygon,比較有效喔!

我們試著拉出其中一列的資料來看內容長什麼樣子。哇賽,是一堆數字!把這些數字投到地圖上,再把它們連起來,最後就能畫出那個里的長相。

sf_tpe %>% head(1) %>% pull(geometry) %>% `[`(1) %>% unlist()
#>   [1]  185730.3  185723.3  185703.1  185701.0  185695.4  185694.8  185684.1
#>   [8]  185429.0  185426.0  185423.8  185410.4  185396.9  185394.7  185396.3
#>  [15]  185380.7  185380.0  185377.2  185366.8  185364.0  185362.9  185358.2
#>  [22]  185358.2  185359.5  185361.8  185390.1  185362.4  185294.1  184977.6
#>  [29]  184944.4  184590.4  184140.2  184074.3  184042.9  184057.4  184182.4
#>  [36]  184185.6  184185.9  184185.9  184198.5  184225.4  184245.3  184265.7
#>  [43]  184271.5  184286.3  184300.0  184301.5  184299.6  184296.6  184285.1
#>  [50]  184264.9  184271.5  184276.2  184301.6  184313.2  184334.9  184350.9
#>  [57]  184371.9  184406.6  184442.1  184439.4  184434.1  184428.1  184418.2
#>  [64]  184423.8  184428.2  184435.3  184457.9  184470.6  184477.7  184504.7
#>  [71]  184514.7  184520.0  184519.9  184520.8  184518.9  184511.2  184508.0
#>  [78]  184508.4  184510.3  184513.9  184518.2  184525.7  184531.5  184542.5
#>  [85]  184556.5  184567.0  184576.4  184585.2  184593.5  184603.2  184610.4
#>  [92]  184614.2  184624.5  184641.6  184648.6  184665.5  184683.5  184694.0
#>  [99]  184708.9  184717.5  184723.2  184739.5  184750.6  184765.6  184769.5
#> [106]  184779.4  184802.0  184821.1  184845.4  184850.9  184851.1  184859.4
#> [113]  184876.0  184883.6  184895.1  184904.6  184921.8  184929.3  184937.8
#> [120]  184956.3  184972.2  185018.8  185024.0  185131.6  185239.3  185243.1
#> [127]  185243.8  185246.5  185248.2  185249.9  185279.1  185279.4  185282.7
#> [134]  185387.8  185416.4  185420.9  185412.7  185416.5  185419.7  185419.7
#> [141]  185434.3  185478.3  185508.7  185515.6  185528.0  185545.2  185624.3
#> [148]  185641.5  185641.8  185647.9  185652.3  185658.7  185672.1  185711.7
#> [155]  185730.3 2489775.0 2489718.1 2489555.0 2489547.7 2489544.8 2489544.5
#> [162] 2489545.0 2489595.8 2489593.5 2489589.8 2489547.7 2489517.2 2489508.0
#> [169] 2489460.7 2489292.0 2489290.0 2489288.7 2489286.5 2489285.0 2489281.5
#> [176] 2489253.2 2489245.5 2489242.3 2489240.5 2489234.2 2489182.5 2489020.5
#> [183] 2488628.6 2488573.5 2488860.1 2489177.8 2489144.8 2489139.2 2489218.6
#> [190] 2489904.9 2489916.7 2489917.8 2489917.9 2489932.2 2489949.6 2489962.7
#> [197] 2489971.2 2489979.2 2489990.6 2490008.4 2490025.9 2490034.3 2490045.2
#> [204] 2490065.4 2490099.1 2490124.0 2490130.1 2490147.1 2490152.2 2490161.5
#> [211] 2490164.4 2490167.2 2490168.2 2490166.4 2490181.4 2490189.5 2490199.3
#> [218] 2490219.0 2490225.6 2490230.2 2490242.5 2490258.4 2490267.8 2490277.0
#> [225] 2490304.6 2490319.0 2490330.0 2490343.7 2490354.3 2490361.6 2490395.0
#> [232] 2490405.6 2490419.6 2490437.1 2490446.1 2490450.8 2490455.3 2490462.9
#> [239] 2490470.7 2490486.5 2490494.1 2490507.5 2490524.6 2490541.5 2490571.0
#> [246] 2490591.4 2490602.7 2490617.4 2490636.4 2490650.8 2490676.6 2490706.1
#> [253] 2490722.5 2490752.9 2490768.0 2490774.1 2490790.5 2490802.5 2490814.6
#> [260] 2490821.5 2490834.5 2490817.0 2490801.5 2490772.3 2490765.5 2490765.3
#> [267] 2490738.2 2490684.3 2490671.0 2490655.5 2490646.0 2490634.0 2490631.0
#> [274] 2490627.5 2490620.5 2490617.8 2490613.9 2490613.5 2490604.7 2490595.0
#> [281] 2490593.5 2490593.3 2490590.0 2490588.0 2490582.3 2490480.7 2490479.8
#> [288] 2490474.2 2490297.5 2490236.5 2490223.5 2490163.5 2490079.5 2490033.1
#> [295] 2490032.8 2490008.0 2489952.0 2489916.6 2489908.5 2489894.0 2489883.0
#> [302] 2489855.0 2489844.8 2489844.1 2489831.5 2489802.0 2489792.5 2489784.2
#> [309] 2489778.0 2489775.0

理解simple feature的長相後,我們往後推進,先進一段現在還沒學到的程式碼,它的意義主要是修改欄位名稱、修改座標系統、修改異體字,以及,為了方便展示,篩選出台北市的圖資。

sf_tpe <-
  sf_tpe %>%
  rename_with(~str_to_lower(.), everything()) %>% 
  mutate(across(where(is.double), ~if_else(is.na(.),as.double(0),.))) %>%
  st_set_crs(3826) %>% st_transform(4326) %>% filter(str_detect(county, "臺北市")) %>%
  mutate(village = if_else(str_detect(village,"糖"),"糖廍里",village))

sf_tpe
#> Simple feature collection with 456 features and 12 fields
#> Geometry type: MULTIPOLYGON
#> Dimension:     XY
#> Bounding box:  xmin: 121.4571 ymin: 24.9605 xmax: 121.6659 ymax: 25.21018
#> Geodetic CRS:  WGS 84
#> First 10 features:
#>    county   town village county_id  town_id         v_id village_id h_cnt p_cnt
#> 1  臺北市 文山區  樟新里     63000 63000080 63000080-031        031  2199  5697
#> 2  臺北市 文山區  老泉里     63000 63000080 63000080-037        037   362   923
#> 3  臺北市 文山區  樟腳里     63000 63000080 63000080-032        032  2108  5674
#> 4  臺北市 文山區  樟文里     63000 63000080 63000080-041        041  2374  6311
#> 5  臺北市 文山區  樟樹里     63000 63000080 63000080-043        043  1825  4898
#> 6  臺北市 文山區  順興里     63000 63000080 63000080-029        029  2902  7642
#> 7  臺北市 文山區  指南里     63000 63000080 63000080-036        036  1766  4108
#> 8  臺北市 文山區  樟林里     63000 63000080 63000080-030        030  3247  8424
#> 9  臺北市 文山區  忠順里     63000 63000080 63000080-038        038  1781  4213
#> 10 臺北市 文山區  試院里     63000 63000080 63000080-023        023  2808  6901
#>    m_cnt f_cnt info_time                       geometry
#> 1   2682  3015   109Y12M MULTIPOLYGON (((121.5595 24...
#> 2    485   438   109Y12M MULTIPOLYGON (((121.5715 24...
#> 3   2735  2939   109Y12M MULTIPOLYGON (((121.5691 24...
#> 4   3048  3263   109Y12M MULTIPOLYGON (((121.5599 24...
#> 5   2324  2574   109Y12M MULTIPOLYGON (((121.5625 24...
#> 6   3674  3968   109Y12M MULTIPOLYGON (((121.5678 24...
#> 7   2099  2009   109Y12M MULTIPOLYGON (((121.5799 24...
#> 8   4103  4321   109Y12M MULTIPOLYGON (((121.5585 24...
#> 9   1986  2227   109Y12M MULTIPOLYGON (((121.5683 24...
#> 10  3276  3625   109Y12M MULTIPOLYGON (((121.5507 24...

在開始畫圖之前,我們最後統整一下simple feature裡面有些什麼東西:

  • 資料結構 – Simple feature collection
  • 幾何組成 – geometry type
  • 維度 – dimension
  • 地理區域 – bbox
  • 大地座標系統 – geographic CRS

用ggplot2畫圖

令人感動的時刻到來。我們利用ggplot()geom_sf()函數,就能立刻畫出台北市的地圖。

sf_tpe %>% ggplot() + geom_sf()

接下來我們來上色。這份資料,有一個欄位p_cnt,意思是人口數量,我們由淺至深,將人口數量映射到顏色上。裡面我還多做一件事,在geom_sf()裡面,把color設成NA,這邊的color原先的作用是邊界的顏色,也就是border line,調整成NA後,雖然看不到分界,但也能因此不會受到分界顏色帶來的干擾。另一個常見做法是設定成灰色,你也可以參考。

sf_tpe %>% ggplot(aes(fill = p_cnt)) + geom_sf(color = NA) +
  scale_fill_gradient(low = "white", high = "purple")

有上過地理課的朋友們,可能會聽老師強調一件事情,地圖上色會誤導人!上面這張圖就是一個好例子,某個面積超大的里A有100人、某個面積超小的里B同樣有100人,但地圖上呈現出來,就會覺得這兩邊的人都很多,但反而沒有顯示出密度不同的事實,所以要慎選變數。我們改成將密度映射到顏色深淺上:

sf_tpe %>% mutate(p_density = p_cnt/(as.double(st_area(.))/1000000)) %>%
  ggplot(aes(fill = p_density)) + geom_sf(color = NA) + scale_fill_gradient(low = "white", high = "purple")

就這樣!大功告成!我們利用R語言,完美的畫出地圖。

不過,有些概念還沒提到,例如上面跳過的CRS,還有空間資料的操作,例如怎麼從村里變成鄉鎮市區,例如想要篩選出北台灣,除了利用縣市名稱以外還有沒有其他做法,這些都會在進階篇補上!

小結

在這篇文章中,我們利用R語言中的sfggplot2套件,畫了一張地圖(map),在此之前,我們認識了空間資料格式,包含vector與raster,另外也介紹空間資料型態,如GeoJSON和shapefile,最後則是談到空間資料結構,包含simple feature與raster。希望你喜歡這篇文章,也能夠增添對於 ggplot2 的認識,並且學到東西。

3 Comments

  1. 教學淺顯易懂,感謝您的無私付出!!

  2. 請 問`[`(1)是什麼意思?

    • 我用底下的程式碼來解釋喔
      第一段
      abc <- c(1,2,3);abc[1] #1 第二段 abc <- c(1,2,3);abc %>% `[`(1) #1
      這兩段的意思一樣
      我們平常看到的 [] 其實是一個函數
      跟 %>% 連用時 `[`(1) 其實就是 object[1] 的意思

Leave a Reply