[R語言專題]用ggplot畫地圖 – 基礎篇
3Last Updated on 2023-12-19
怎麼用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.”
- 優點: 計算效率高,適合進行大範圍的空間分析。 能夠更容易地表示連續變數。 容易取得衛星影像等遙測資料。
- 缺點: 精確度受到格子大小的限制。想想地理的比例尺。 可能需要更多的儲存空間。格子越細密能存越多東西。 屬性資料的管理較為複雜。
範例
- 台北市政府的開放資料:台北市各里人口數和台北市里界圖,前者的資料格式為 csv ,後者為 shapefile
- 內政部的SEGIS資料庫:台北市人口統計_村里與和台北市人口統計_最小統計區,資料格式則是 csv 和 shapefile 都有
認識空間資料格式
為什麼要先認識空間資料格式,而非空間資料結構呢?因為後面會花比較大的篇幅介紹空間資料結構,所以把格式拉到前面。
- 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
GeoJSON
使用跟 JSON 類似的原始格式,但設計上有特別考慮在表現出地理特徵以外,也保留 non-spatial 的屬性。
地理特徵包含 points, line strings, polygons, and multi-part collections of these types. 你可以看這篇在R語言中處理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)
因為應用學門不同,資料型態也不同,所以這次教學不會使用 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。
其實,除了 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語言中的sf
與ggplot2
套件,畫了一張地圖(map),在此之前,我們認識了空間資料格式,包含vector與raster,另外也介紹空間資料型態,如GeoJSON和shapefile,最後則是談到空間資料結構,包含simple feature與raster。希望你喜歡這篇文章,也能夠增添對於 ggplot2
的認識,並且學到東西。
2023-11-16 at 10:43 //
教學淺顯易懂,感謝您的無私付出!!
2023-12-18 at 20:16 //
請 問`[`(1)是什麼意思?
2023-12-19 at 03:23 //
我用底下的程式碼來解釋喔
第一段
abc <- c(1,2,3);abc[1] #1 第二段 abc <- c(1,2,3);abc %>% `[`(1) #1
這兩段的意思一樣
我們平常看到的 [] 其實是一個函數
跟 %>% 連用時 `[`(1) 其實就是 object[1] 的意思