6 地圖
地圖繪制是一項常見的可視化任務潜秋,需要用到專門的工具恨溜。主要解決兩個方面的問題:使用一個數(shù)據(jù)源繪制地圖,以及將另一個信息的數(shù)據(jù)添加到地圖中男杈。
6.1 矢量邊界
使用geom_polygon()或許是繪制地圖最簡單的方法丈屹,它是為不同區(qū)域繪制邊界。通過使用ggplot2::map_data()數(shù)據(jù)伶棒, 該地圖包不是特別準確或最新的包旺垒,但它內(nèi)置在 R 中,它是密歇根州縣邊界的數(shù)據(jù)集:
mi_counties <- map_data("county", "michigan") %>%
select(lon = long, lat, group, id = subregion)
head(mi_counties)
#> lon lat group id
#> 1 -83.9 44.9 1 alcona
#> 2 -83.4 44.9 1 alcona
#> 3 -83.4 44.9 1 alcona
#> 4 -83.3 44.8 1 alcona
#> 5 -83.3 44.8 1 alcona
#> 6 -83.3 44.8 1 alcona
在這個數(shù)據(jù)集中有四個變量:lat
和long
指定邊界點的緯度和經(jīng)度(即邊界點的坐標)肤无,id
指一個區(qū)域的名稱先蒋,group
提供了一個區(qū)域內(nèi)的連續(xù)區(qū)域的獨特標識符(例如,如果一個區(qū)域由多個島嶼組成)宛渐。為了更好地了解數(shù)據(jù)包含的內(nèi)容竞漾,我們可以使用mi_counties
數(shù)據(jù)繪圖geom_point(),如下所示窥翩。在此圖中业岁,數(shù)據(jù)框中的每一行都繪制為一個點,從而生成一個散點圖寇蚊,顯示每個縣的角點笔时。為了將這個散點圖變成地圖,我們改為使用geom_polygon()仗岸,它將每個縣繪制為一個不規(guī)則的多邊形糊闽。
ggplot(mi_counties, aes(lon, lat)) +
geom_point(size = .25, show.legend = FALSE) +
coord_quickmap()
ggplot(mi_counties, aes(lon, lat, group = group)) +
geom_polygon(fill = "white", colour = "grey50") +
coord_quickmap()
在這兩個圖中梳玫,coord_quickmap()`來調(diào)整軸以確保經(jīng)度和緯度以相同的比例呈現(xiàn)。coord中討論了 ggplot2 中的坐標系右犹,但正如我們將在下面看到的提澎,地圖數(shù)據(jù)通常需要更嚴格的方法。因此念链,ggplot2 提供geom_sf()和coord_sf()處理以簡單的空間數(shù)據(jù)盼忌。
6.2 簡單的特征圖
上面概述的方法有一些局限性,尤其是簡單的“經(jīng)緯度”數(shù)據(jù)格式在實際映射中通常不使用掂墓。地圖的矢量數(shù)據(jù)通常使用開放地理空間聯(lián)盟產(chǎn)生的“簡單特征”標準進行編碼谦纱。Edzer Pebesma https://github.com/r-spatial/sf開發(fā)的[sf] (https://github.com/r-spatial/sf)包為處理這些數(shù)據(jù)提供了一個很好的工具,并且ggplot2中的geom_sf()和coord_sf()函數(shù)可以與sf包一起工作君编。
為了引入這些功能跨嘉,我們依賴于Michael Sumner https://github.com/mdsumner/ozmaps/的 ozmaps 包,該包提供澳大利亞州邊界吃嘿、地方政府區(qū)域祠乃、選舉邊界等的地圖,為了說明sf數(shù)據(jù)集是什么樣子的兑燥,我們導入了一個數(shù)據(jù)集亮瓷,描述了澳大利亞各州和領(lǐng)土的邊界:
library(ozmaps)
library(sf)
oz_states <- ozmaps::ozmap_states
oz_states
#> Simple feature collection with 9 features and 1 field
#> Geometry type: MULTIPOLYGON
#> Dimension: XY
#> Bounding box: xmin: 106 ymin: -43.6 xmax: 168 ymax: -9.23
#> Geodetic CRS: GDA94
#> # A tibble: 9 × 2
#> NAME geometry
#> * <chr> <MULTIPOLYGON [°]>
#> 1 New South Wales (((151 -35.1, 151 -35.1, 151 -35.1, 151 -35.1, 151 -35.2, 1…
#> 2 Victoria (((147 -38.7, 147 -38.7, 147 -38.7, 147 -38.7, 147 -38.7)),…
#> 3 Queensland (((149 -20.3, 149 -20.4, 149 -20.4, 149 -20.3)), ((149 -20.…
#> 4 South Australia (((137 -34.5, 137 -34.5, 137 -34.5, 137 -34.5, 137 -34.5, 1…
#> 5 Western Australia (((126 -14, 126 -14, 126 -14, 126 -14, 126 -14)), ((124 -16…
#> 6 Tasmania (((148 -40.3, 148 -40.3, 148 -40.3, 148 -40.3)), ((147 -39.…
#> # … with 3 more rows
該輸出顯示了與數(shù)據(jù)相關(guān)的一些元數(shù)據(jù)(稍后討論),并告訴我們該數(shù)據(jù)實際上是一個9行2列的tibble降瞳。sf數(shù)據(jù)的一個優(yōu)勢是顯而易見的嘱支,我們可以很容易地看到數(shù)據(jù)的整體結(jié)構(gòu):澳大利亞由6個州和一些地區(qū)組成。這里有9個不同的地理單位挣饥,所以在這個tibble中有9行(參見mi_counties
數(shù)據(jù)除师,每個多邊形頂點有一行)。
最重要的列是geometry
扔枫,它指定每個州和地區(qū)的空間幾何圖形馍盟。幾何列中的每個元素都是多個多邊形對象,顧名思義茧吊,它包含指定一個或多個多邊形頂點的數(shù)據(jù)贞岭,這些頂點劃分了區(qū)域的邊界。對于這種格式的數(shù)據(jù)搓侄,我們可以使用geom_sf()和coord_sf()來繪制一個可用的地圖瞄桨,而不需要指定任何參數(shù),甚至不需要明確聲明任何圖形屬性:
ggplot(oz_states) +
geom_sf() +
coord_sf()
要理解為什么這樣做讶踪,請注意geom_sf()依賴于ggplot2中其他地方?jīng)]有使用的幾何對象芯侥。這種圖形屬性可以通過以下三種方式指定:
在最簡單的情況下(如上所示),當用戶什么都不做時, geom_sf()將嘗試將其映射到名為
geometry
的列柱查。如果
data
參數(shù)是 sf 對象廓俭,則geom_sf()可以自動檢測幾何列,即使它沒有調(diào)用geometry
唉工。您可以使用
aes(geometry = my_column)
以通常的方式手動指定映射研乒。如果您有多個列,這很有用淋硝。
coord_sf()函數(shù)管理在后續(xù)討論地圖投影雹熬。
6.2.1 分層地圖
在某些情況下,您可能希望將一個地圖覆蓋在另一個地圖之上谣膳。ggplot2包支持這一點竿报,它允許您向一個繪圖添加多個geom_sf()層。例如继谚,我將使用oz_states
數(shù)據(jù)以不同的顏色繪制澳大利亞各州烈菌,并將澳大利亞地區(qū)的邊界覆蓋在此圖上。為此花履,需要執(zhí)行兩個預處理步驟芽世。首先,我將使用dplyr::filter()從州邊界刪除“Other Territories”臭挽。
下面的代碼繪制了一個帶有兩個地圖層的圖:第一個使用oz_states
以不同的顏色填充各州捂襟,第二個使用oz_votes
繪制選區(qū)邊界咬腕。其次欢峰,我將使用rmapshaper包中的ms_simplify()
函數(shù)以簡化的形式提取選區(qū)邊界如果原始數(shù)據(jù)集(在這種情況下是ozmaps::abs_ced),存儲在比你的繪圖要求更高的分辨率,這通常是一個好主意涨共,以減少渲染繪圖所花費的時間纽帖。
oz_states <- ozmaps::ozmap_states %>% filter(NAME != "Other Territories")
oz_votes <- rmapshaper::ms_simplify(ozmaps::abs_ced)
#> Registered S3 method overwritten by 'geojsonlint':
#> method from
#> print.location dplyr
現(xiàn)在有了分別代表州邊界和選區(qū)邊界的數(shù)據(jù)集oz_states
和oz_votes
,可以通過向圖形中添加兩個geom_sf()層來構(gòu)建理想的繪圖結(jié)果:
ggplot() +
geom_sf(data = oz_states, mapping = aes(fill = NAME), show.legend = FALSE) +
geom_sf(data = oz_votes, fill = NA) +
coord_sf()
值得注意的是举反,該圖的第一層將fill
圖形屬性映射到數(shù)據(jù)中的變量上懊直。在這種情況下,NAME
變量是一個分類變量火鼻,不傳達任何附加信息室囊,但可以使用相同的方法來可視化其他類型的區(qū)域元數(shù)據(jù)。例如魁索,如果oz_states
有一個額外的列融撞,指定每個州的失業(yè)率,我們可以將fill
圖形屬性映射到該變量粗蔚。
6.2.2 地圖標簽
向地圖添加標簽是注釋圖(第8章)的一個示例尝偎,并受[geom_sf_label()](https://ggplot2.tidyverse.org/reference/ggsf.html)
和支持[geom_sf_text()](https://ggplot2.tidyverse.org/reference/ggsf.html)
。例如,雖然可以合理地期望澳大利亞觀眾知道澳大利亞各州的名稱(并且在上圖中沒有標記)致扯,但很少有澳大利亞人會知道悉尼大都市區(qū)不同選區(qū)的名稱肤寝。為了繪制悉尼的選舉地圖,我們首先需要提取相關(guān)選區(qū)的地圖數(shù)據(jù)抖僵,然后添加標簽鲤看。下圖通過指定xlim
和ylim
in來放大悉尼地區(qū)[coord_sf()](https://ggplot2.tidyverse.org/reference/ggsf.html)
,然后使用[geom_sf_label()](https://ggplot2.tidyverse.org/reference/ggsf.html)
標簽覆蓋每個選區(qū):
給地圖添加標簽是注釋圖的一個例子裆针,它由geom_sf_label()和geom_sf_text()支持刨摩。例如,雖然澳大利亞人可能會知道澳大利亞各州的名字(在上面的圖中沒有標注)世吨,但很少澳大利亞人會知道悉尼大都市區(qū)不同選區(qū)的名稱澡刹。為了繪制悉尼的選區(qū)地圖,我們首先需要提取相關(guān)選區(qū)的的地圖數(shù)據(jù)耘婚,然后添加標簽罢浇。下面的圖通過在coord_sf()中指定xlim
和ylim
來放大悉尼地區(qū),然后使用geom_sf_label()用標簽覆蓋每個選區(qū)
# filter electorates in the Sydney metropolitan region
sydney_map <- ozmaps::abs_ced %>% filter(NAME %in% c(
"Sydney", "Wentworth", "Warringah", "Kingsford Smith", "Grayndler", "Lowe",
"North Sydney", "Barton", "Bradfield", "Banks", "Blaxland", "Reid",
"Watson", "Fowler", "Werriwa", "Prospect", "Parramatta", "Bennelong",
"Mackellar", "Greenway", "Mitchell", "Chifley", "McMahon"
))
# draw the electoral map of Sydney
ggplot(sydney_map) +
geom_sf(aes(fill = NAME), show.legend = FALSE) +
coord_sf(xlim = c(150.97, 151.3), ylim = c(-33.98, -33.79)) +
geom_sf_label(aes(label = NAME), label.padding = unit(1, "mm"))
#> Warning in st_point_on_surface.sfc(sf::st_zm(x)): st_point_on_surface may not
#> give correct results for longitude/latitude data
警告信息值得注意沐祷。在內(nèi)部[geom_sf_label()](https://ggplot2.tidyverse.org/reference/ggsf.html)
使用[st_point_on_surface()](https://r-spatial.github.io/sf/reference/geos_unary.html)
sf 包中的函數(shù) 來放置標簽嚷闭,并且出現(xiàn)警告消息是因為 sf 用于計算幾何量(例如質(zhì)心、內(nèi)部點)的大多數(shù)算法都是基于點位于平面二維上的假設(shè)表面并用笛卡爾坐標參數(shù)化赖临。這種假設(shè)不是嚴格保證的胞锰,并且在某些情況下(例如,極地附近的區(qū)域)以這種方式處理經(jīng)度和緯度的計算將給出錯誤的答案兢榨。出于這個原因嗅榕, sf 包在依賴此近似值時會產(chǎn)生警告消息。
警告信息是值得注意的吵聪。在內(nèi)部geom_sf_label()使用來自sf包的函數(shù)st_point_on_surface()來放置標簽凌那,并且出現(xiàn)警告消息是因為sf使用的大多數(shù)算法來計算幾何數(shù)量(例如,質(zhì)心吟逝,內(nèi)點)是基于一個假設(shè)帽蝶,即這些點位于平面二維表面上,并用笛卡爾坐標參數(shù)化块攒。這種假設(shè)并不嚴格励稳,在某些情況下(例如,靠近極點的地區(qū))囱井,以這種方式處理經(jīng)度和緯度的計算將給出錯誤的答案驹尼。因此,sf包在依賴這個近似時產(chǎn)生警告消息琅绅。
6.2.3 添加其他幾何對象
雖然geom_sf()在某些方面很特殊的扶欣,但它的行為與任何其他geom基本相同,允許使用標準geom在地圖上繪制額外的數(shù)據(jù)。例如料祠,我們可能希望使用geom_point()在地圖上繪制澳大利亞首都城市的位置骆捧。下面的代碼演示了如何做到這一點:
oz_capitals <- tibble::tribble(
~city, ~lat, ~lon,
"Sydney", -33.8688, 151.2093,
"Melbourne", -37.8136, 144.9631,
"Brisbane", -27.4698, 153.0251,
"Adelaide", -34.9285, 138.6007,
"Perth", -31.9505, 115.8605,
"Hobart", -42.8821, 147.3272,
"Canberra", -35.2809, 149.1300,
"Darwin", -12.4634, 130.8456,
)
ggplot() +
geom_sf(data = oz_votes) +
geom_sf(data = oz_states, colour = "black", fill = NA) +
geom_point(data = oz_capitals, mapping = aes(x = lon, y = lat), colour = "red") +
coord_sf()
在這個示例中枪汪,geom_point
僅用于指定首都城市的位置钞脂,但其基本思想可以擴展到更一般地處理點元數(shù)據(jù)。例如恋沃,如果oz_capitals數(shù)據(jù)包含一個額外的變量顺呕,該變量指定每個大都市區(qū)域內(nèi)的選民數(shù)量枫攀,那么我們可以使用size
圖形屬性對該數(shù)據(jù)進行編碼。
6.3 光柵圖
為制圖提供地理空間信息的第二種方法是依賴柵格數(shù)據(jù)株茶。與簡單特征格式不同来涨,在簡單特征格式中,地理實體是由一組線启盛、點和多邊形指定的蹦掐,柵格采用圖像的形式。在最簡單的情況下僵闯,光柵數(shù)據(jù)可能只是一個位圖文件卧抗,但有許多不同的圖像格式。特別是在地理空間方面鳖粟,有些圖像格式包含元數(shù)據(jù)(例如大地基準面社裆、坐標參考系統(tǒng)),可用于將圖像信息映射到地球表面向图。例如泳秀,一種常見的格式是GeoTIFF,這是一個常規(guī)的TIFF文件张漂,并提供了額外的元數(shù)據(jù)晶默。幸運的是谨娜,在GDAL(地理空間數(shù)據(jù)抽象庫航攒,https://gdal.org/)的幫助下,大多數(shù)格式都可以輕松地讀入R趴梢。例如漠畜,sf包包含一個函數(shù)sf::gdal_read(),它提供從R訪問GDAL光柵驅(qū)動程序坞靶。然而憔狞,您很少需要直接調(diào)用這個函數(shù),因為有其他高級函數(shù)會為您處理這個問題彰阴。
例如瘾敢,假設(shè)我們希望繪制澳大利亞氣象局 (BOM) 在其 FTP 服務器上公開提供的衛(wèi)星圖像。bomrang 包24為服務器提供了一個方便的接口,包括一個get_available_imagery()
返回文件名向量的get_satellite_imagery()
函數(shù)和一個下載文件并將其直接導入 R的函數(shù)簇抵。然而庆杜,為了說明的目的,我將使用一個更靈活的方法可適配任何FTP服務器碟摆,使用[download.file()](https://rdrr.io/r/utils/download.file.html)
功能:
舉例來說晃财,假設(shè)我們希望繪制澳大利亞氣象局(BOM)在其FTP服務器上公開提供的衛(wèi)星圖像。bomrang包為服務器提供了一個方便的接口,包括一個get_available_imagery()
函數(shù),它返回一個向量的文件名和get_satellite_imagery()
函數(shù),下載一個文件,直接進口到R .用于說明的目的,我將使用一個更靈活的方法,可以適應任何FTP服務器,并使用download.file()函數(shù):
# list of all file names with time stamp 2020-01-07 21:00 GMT
# (BOM images are retained for 24 hours, so this will return an
# empty vector if you run this code without editing the time stamp)
files <- bomrang::get_available_imagery() %>%
stringr::str_subset("202001072100")
# use curl_download() to obtain a single file, and purrr to
# vectorise this operation
purrr::walk2(
.x = paste0("ftp://ftp.bom.gov.au/anon/gen/gms/", files),
.y = file.path("raster", files),
.f = ~ download.file(url = .x, destfile = .y)
)
請注意典蜕,如果您想自己運行此代碼断盛,您需要將時間戳字符串從"202001072100"
當前日期的前一天更改為當前日期的前一天,并且您需要確保在您的工作目錄中有一個名為“raster”的文件夾愉舔,其中文件將被下載钢猛。在本地緩存文件后,我們可以檢查已下載的文件列表:
dir("raster")
#> [1] "IDE00421.202001072100.tif" "IDE00422.202001072100.tif"
所有 14 個文件均由日本氣象廳運營的 Himawari-8 地球靜止衛(wèi)星拍攝的圖像構(gòu)建轩缤,并在 13 個不同波段拍攝圖像厢洞。澳大利亞 BOM 發(fā)布的圖像包括可見光譜(通道 3)和紅外光譜(通道 13)的數(shù)據(jù):
img_vis <- file.path("raster", "IDE00422.202001072100.tif")
img_inf <- file.path("raster", "IDE00421.202001072100.tif")
要將img_visible文件中的數(shù)據(jù)導入R,我將使用stars包將數(shù)據(jù)導入為stars對象:
library(stars)
sat_vis <- read_stars(img_vis, RasterIO = list(nBufXSize = 600, nBufYSize = 600))
sat_inf <- read_stars(img_inf, RasterIO = list(nBufXSize = 600, nBufYSize = 600))
在上面的代碼中典奉,第一個參數(shù)指定了光柵文件的路徑躺翻,該RasterIO
參數(shù)用于將低級參數(shù)列表傳遞給 GDAL。在這種情況下卫玖,我使用nBufXSize
和nBufYSize
確保 R 以低分辨率讀取數(shù)據(jù)(作為 600x600 像素圖像)公你。要查看 R 導入了哪些信息,我們可以檢查sat_vis
對象:
sat_vis
#> stars object with 3 dimensions and 1 attribute
#> attribute(s), summary of first 1e+05 cells:
#> Min. 1st Qu. Median Mean 3rd Qu. Max.
#> IDE00422.202001072100.tif 0 0 0 18.1 0 255
#> dimension(s):
#> from to offset delta refsys point values x/y
#> x 1 600 -5500000 18333.3 Geostationary_Satellite FALSE NULL [x]
#> y 1 600 5500000 -18333.3 Geostationary_Satellite FALSE NULL [y]
#> band 1 3 NA NA NA NA NULL
這個輸出告訴我們一些關(guān)于星星對象結(jié)構(gòu)的信息假瞬。對于sat_vis
對象陕靠,底層數(shù)據(jù)存儲為一個三維數(shù)組,其中x
和y
維度指定空間數(shù)據(jù)脱茉。band
在這種情況下剪芥,維度對應于顏色通道 (RGB),但由于數(shù)據(jù)是灰度的琴许,因此對于該圖像來說是多余的税肪。在其他數(shù)據(jù)集中,可能有對應于不同傳感器的波段榜田,也可能有時間維度益兄。請注意,空間數(shù)據(jù)還與坐標參考系統(tǒng)(在輸出中稱為“refsys”)相關(guān)聯(lián)箭券。
要在 ggplot2 中繪制數(shù)據(jù)sat_vis
净捅,我們可以使用stars 包提供的函數(shù)geom_stars()。圖形可能是這樣的:
ggplot() +
geom_stars(data = sat_vis) +
coord_equal()
該geom_stars()函數(shù)要求data
參數(shù)是一個星星對象辩块,并將柵格數(shù)據(jù)映射到fill
圖形屬性蛔六。因此荆永,上面衛(wèi)星圖像中的藍色陰影是由 ggplot2 比例決定的,而不是圖像本身国章。也就是說屁魏,雖然sat_vis
包含三個波段,但上面的圖只顯示第一個波段捉腥,原始數(shù)據(jù)值(范圍從 0 到 255)映射到 ggplot2 用于連續(xù)數(shù)據(jù)的默認藍色調(diào)色板氓拼。要查看圖像文件“真正”的樣子,我們可以使用facet_wrap()以下命令分離波段:
ggplot() +
geom_stars(data = sat_vis, show.legend = FALSE) +
facet_wrap(vars(band)) +
coord_equal() +
scale_fill_gradient(low = "black", high = "white")
僅顯示原始圖像的一個限制是不容易確定相關(guān)陸地的位置抵碟,我們可能希望將衛(wèi)星數(shù)據(jù)與oz_states
矢量圖重疊以顯示澳大利亞政治實體的輪廓桃漾。但是,這樣做需要小心拟逮,因為兩個數(shù)據(jù)源與不同的坐標參考系統(tǒng)相關(guān)聯(lián)撬统。要正確投影數(shù)據(jù)oz_states
,應使用sf 包中的函數(shù)st_transform()轉(zhuǎn)換數(shù)據(jù)敦迄。在下面的代碼中恋追,我從sat_vis
柵格對象中提取 CRS ,并將oz_states
數(shù)據(jù)轉(zhuǎn)換到相同的系統(tǒng)下使用罚屋。
oz_states <- st_transform(oz_states, crs = st_crs(sat_vis))
完成后苦囱,我現(xiàn)在可以在光柵圖像的頂部繪制矢量圖,以使圖像更易于讀者理解∑⒚停現(xiàn)在通過檢查可以清楚地看到衛(wèi)星圖像是在澳大利亞日出時拍攝的:
ggplot() +
geom_stars(data = sat_vis, show.legend = FALSE) +
geom_sf(data = oz_states, fill = NA, color = "white") +
coord_sf() +
theme_void() +
scale_fill_gradient(low = "black", high = "white")
如果我們想在頂部繪制更常規(guī)的數(shù)據(jù)怎么辦撕彤?一個簡單的例子是根據(jù)oz_capitals
包含緯度和經(jīng)度數(shù)據(jù)的數(shù)據(jù)框繪制澳大利亞首府城市的位置。然而猛拴,由于這些數(shù)據(jù)不與CRS相關(guān)聯(lián)羹铅,并且不在同一規(guī)模作為柵格數(shù)據(jù)sat_vis
,這將需要進行改造愉昆。為此职员,我們首先需要使用oz_capitals
以下數(shù)據(jù)從數(shù)據(jù)創(chuàng)建一個 sf 對象[st_as_sf()](https://r-spatial.github.io/stars/reference/st_as_sf.html)
:
cities <- oz_capitals %>%
st_as_sf(coords = c("lon", "lat"), crs = 4326, remove = FALSE)
此投影是使用 EPSG 代碼 4326 設(shè)置的,這是一種使用緯度和經(jīng)度值作為坐標并依賴于 WGS84 數(shù)據(jù)的橢球投影跛溉。完成后焊切,我們現(xiàn)在可以將坐標從經(jīng)緯度幾何轉(zhuǎn)換為匹配我們數(shù)據(jù)sat_vis
的幾何對象:
cities <- st_transform(cities, st_crs(sat_vis))
現(xiàn)在可以使用geom_sf()以下方法覆蓋轉(zhuǎn)換后的數(shù)據(jù):
ggplot() +
geom_stars(data = sat_vis, show.legend = FALSE) +
geom_sf(data = oz_states, fill = NA, color = "white") +
geom_sf(data = cities, color = "red") +
coord_sf() +
theme_void() +
scale_fill_gradient(low = "black", high = "white")
這個版本的圖像更清楚地表明衛(wèi)星圖像是在達爾文大約日出時拍攝的:所有東部城市的太陽都已經(jīng)升起,但珀斯沒有倒谷。這可以在數(shù)據(jù)可視化中使用geom_sf_text()為每個城市添加標簽的功能更加清晰蛛蒙。例如糙箍,我們可以使用這樣的代碼向繪圖添加另一個圖層渤愁,
geom_sf_text(data = cities, mapping = aes(label = city))
如何更好的設(shè)定文本的位置(參見注釋)。