這組 geom、stat 和 coord 用於可視化簡單特征 (sf) 對象。對於簡單的繪圖,您隻需要geom_sf()
,因為它使用stat_sf()
並為您添加coord_sf()
。 geom_sf()
是一種不尋常的幾何對象,因為它會根據數據中存在的簡單特征繪製不同的幾何對象:您可以獲得點、線或多邊形。對於文本和標簽,您可以使用 geom_sf_text()
和 geom_sf_label()
。
用法
coord_sf(
xlim = NULL,
ylim = NULL,
expand = TRUE,
crs = NULL,
default_crs = NULL,
datum = sf::st_crs(4326),
label_graticule = waiver(),
label_axes = waiver(),
lims_method = "cross",
ndiscr = 100,
default = FALSE,
clip = "on"
)
geom_sf(
mapping = aes(),
data = NULL,
stat = "sf",
position = "identity",
na.rm = FALSE,
show.legend = NA,
inherit.aes = TRUE,
...
)
geom_sf_label(
mapping = aes(),
data = NULL,
stat = "sf_coordinates",
position = "identity",
...,
parse = FALSE,
nudge_x = 0,
nudge_y = 0,
label.padding = unit(0.25, "lines"),
label.r = unit(0.15, "lines"),
label.size = 0.25,
na.rm = FALSE,
show.legend = NA,
inherit.aes = TRUE,
fun.geometry = NULL
)
geom_sf_text(
mapping = aes(),
data = NULL,
stat = "sf_coordinates",
position = "identity",
...,
parse = FALSE,
nudge_x = 0,
nudge_y = 0,
check_overlap = FALSE,
na.rm = FALSE,
show.legend = NA,
inherit.aes = TRUE,
fun.geometry = NULL
)
stat_sf(
mapping = NULL,
data = NULL,
geom = "rect",
position = "identity",
na.rm = FALSE,
show.legend = NA,
inherit.aes = TRUE,
...
)
參數
- xlim, ylim
-
x 軸和 y 軸的限製。這些限製以默認 CRS 的單位指定。默認情況下,這意味著投影坐標 (
default_crs = NULL
)。當使用非線性或旋轉坐標係作為默認 crs 時,限製規範如何轉換為繪圖上顯示的精確區域可能會令人困惑。首先,在不同的條件下可以選擇不同的方法。詳細信息請參見參數lims_method
。其次,僅沿一個方向指定限製可能會影響沿另一方向自動生成的限製。因此,最好始終指定 x 和 y 的限製。第三,強烈建議不要通過位置比例或xlim()
/ylim()
指定限製,因為這可能會導致數據點從圖中刪除,即使它們在最終繪圖區域中可見。 - expand
-
如果
TRUE
(默認值)會在限製中添加一個小的擴展因子,以確保數據和軸不重疊。如果FALSE
,則完全從數據或xlim
/ylim
中獲取限製。 - crs
-
繪圖前應將所有數據投影到的坐標參考係 (CRS)。如果未指定,將使用繪圖的第一個 sf 層中定義的 CRS。
- default_crs
-
用於非 sf 圖層(不攜帶任何 CRS 信息)和比例限製的默認 CRS。
NULL
的默認值表示使用crs
的設置。這意味著所有非 sf 圖層和比例限製均假定在投影坐標中指定。一個有用的替代設置是default_crs = sf::st_crs(4326)
,這意味著 x 和 y 位置分別解釋為 1984 年世界大地測量係統 (WGS84) 中的經度和緯度。 - datum
-
CRS 提供生成經緯網時使用的數據。
- label_graticule
-
指示應在何處標記哪些經緯線的字符向量。經絡運行 north-south,字母
"N"
和"S"
表示它們應分別標記在其北端點或南端點上。並行運行 east-west,字母"E"
和"W"
表示應分別在其東端點或西端點上進行標記。因此,label_graticule = "SW"
將在南端標記經線,在西端標記緯線,而label_graticule = "EW"
將在兩端標記緯線,而根本不標記經線。由於經線和緯線通常可以與繪圖麵板的任何一側相交,因此對於label_graticule
標簽的任何選擇都不能保證僅駐留在繪圖麵板的一側。此外,label_graticule
可能會導致標簽偽影,特別是當標線與繪圖麵板的邊重合時。在這種情況下,label_axes
通常會產生更好的結果,應該改用。該參數可以單獨使用,也可以與
label_axes
結合使用。 - label_axes
-
字符向量或字符值的命名列表,指定應在圖的哪一側標記哪些經緯線(經線或平行線)。子午線由
"E"
(代表東)表示,平行線由"N"
(代表北)表示。默認值為"--EN"
,它指定(從頂部順時針方向)頂部沒有標簽,右側沒有標簽,底部有經線,左側有平行線。或者,可以使用list(bottom = "E", left = "N")
指定此設置。該參數可以單獨使用,也可以與
label_graticule
結合使用。 - lims_method
-
指定如何將比例限製轉換為繪圖區域限製的方法。當
default_crs = NULL
時無效。對於非常非線性的 CRS(例如,以北極為中心的視角),可用的方法會產生截然不同的結果,您可能需要嘗試各種選項。當前實現的方法包括"cross"
(默認)、"box"
、"orthogonal"
和"geometry_bbox"
。對於方法"cross"
,沿一個方向(例如,經度)的限製應用於另一方向(例如,緯度)的中點。此方法避免了旋轉坐標係的過大限製,但意味著如果要在最終繪圖區域中包含極端數據點,有時需要進一步擴大限製。相比之下,對於方法"box"
,會在兩個方向的限製之外生成一個框,然後選擇投影坐標中的限製以使整個框可見。此方法可能會產生太大的繪圖區域。最後,方法"orthogonal"
沿每個軸單獨應用限製,方法"geometry_bbox"
忽略除geometry
美學中任何對象的邊界框之外的所有限製信息。 - ndiscr
-
用於離散刻度線的線段數量;當刻度看起來不正確時,請嘗試增加此數字。
- default
-
這是默認的坐標係嗎?如果
FALSE
(默認值),則將此坐標係替換為另一個坐標係會創建一條消息,提醒用戶坐標係正在被替換。如果TRUE
,則該警告被抑製。 - clip
-
是否應該將繪圖裁剪到繪圖麵板的範圍內?設置
"on"
(默認)表示是,設置"off"
表示否。在大多數情況下,不應更改"on"
的默認值,因為設置clip = "off"
可能會導致意外結果。它允許在繪圖上的任何位置繪製數據點,包括繪圖邊。如果通過xlim
和ylim
設置限製,並且某些數據點超出這些限製,則這些數據點可能會顯示在軸、圖例、繪圖標題或繪圖邊距等位置。 - mapping
-
由
aes()
創建的一組美學映射。如果指定且inherit.aes = TRUE
(默認),它將與繪圖頂層的默認映射組合。如果沒有繪圖映射,則必須提供mapping
。 - data
-
該層要顯示的數據。有以下三種選擇:
如果默認為
NULL
,則數據繼承自ggplot()
調用中指定的繪圖數據。data.frame
或其他對象將覆蓋繪圖數據。所有對象都將被強化以生成 DataFrame 。請參閱fortify()
將為其創建變量。將使用單個參數(繪圖數據)調用
function
。返回值必須是data.frame
,並將用作圖層數據。可以從formula
創建function
(例如~ head(.x, 10)
)。 - stat
-
用於該層數據的統計變換,可以作為
ggproto
Geom
子類,也可以作為命名去掉stat_
前綴的統計數據的字符串(例如"count"
而不是"stat_count"
) - position
-
位置調整,可以是命名調整的字符串(例如
"jitter"
使用position_jitter
),也可以是調用位置調整函數的結果。如果需要更改調整設置,請使用後者。 - na.rm
-
如果
FALSE
,則默認缺失值將被刪除並帶有警告。如果TRUE
,缺失值將被靜默刪除。 - show.legend
-
合乎邏輯的。該層是否應該包含在圖例中?
NA
(默認值)包括是否映射了任何美學。FALSE
從不包含,而TRUE
始終包含。您還可以將其設置為 "polygon"、"line" 和 "point" 之一以覆蓋默認圖例。
- inherit.aes
-
如果
FALSE
,則覆蓋默認美學,而不是與它們組合。這對於定義數據和美觀的輔助函數最有用,並且不應繼承默認繪圖規範的行為,例如borders()
。 - ...
-
其他參數傳遞給
layer()
。這些通常是美學,用於將美學設置為固定值,例如colour = "red"
或size = 3
。它們也可能是配對的 geom/stat 的參數。 - parse
-
如果是
TRUE
,標簽將被解析為表達式並按照?plotmath
中的說明進行顯示。 - nudge_x, nudge_y
-
水平和垂直調整以微移標簽。對於從點偏移文本非常有用,特別是在離散比例上。不能與
position
共同指定。 - label.padding
-
標簽周圍的填充量。默認為 0.25 行。
- label.r
-
圓角半徑。默認為 0.15 行。
- label.size
-
標簽邊框尺寸,以毫米為單位。
- fun.geometry
-
該函數接受
sfc
對象並返回與輸入長度相同的sfc_POINT
。如果NULL
,將使用function(x) sf::st_point_on_surface(sf::st_zm(x))
。請注意,如果未投影數據,該函數可能會警告結果不正確,但您可以忽略此錯誤,除非您真正關心確切位置。 - check_overlap
-
如果是
TRUE
,則不會繪製與同一層中先前文本重疊的文本。check_overlap
在繪製時按數據順序發生。因此,在調用geom_text()
之前,應按標簽列排列數據。請注意,geom_label()
不支持此參數。 - geom
-
用於顯示數據的幾何對象,可以作為
ggproto
Geom
子類,也可以作為命名去除geom_
前綴的幾何對象的字符串(例如"point"
而不是"geom_point"
)
幾何美學
geom_sf()
使用獨特的美學: geometry
,給出包含簡單特征數據的類 sfc
列。可通過三種方式提供 geometry
美感:
-
不執行任何操作:默認情況下,
geom_sf()
假定它存儲在geometry
列中。 -
將
sf
對象顯式傳遞給data
參數。這將使用主幾何列,無論它叫什麽。 -
使用
aes(geometry = my_column)
提供您自己的
與其他美學不同,geometry
永遠不會從劇情中繼承。
結合 sf 圖層和常規幾何圖形
大多數常規幾何圖形,例如 geom_point()
、 geom_path()
、 geom_text()
、 geom_polygon()
等都可以與 coord_sf()
配合使用。然而,當使用這些幾何圖形時,會出現兩個問題。首先,這些非 sf 幾何對象使用的 x 和 y 坐標應該使用什麽 CRS?應用於非 sf 幾何圖形的 CRS 由 default_crs
參數設置,默認為 NULL
,這意味著非 sf 幾何圖形的位置被解釋為 crs
參數設置的坐標係中的投影坐標。此設置允許您完全控製項目在繪圖畫布上的確切位置,但可能需要對投影的工作原理以及如何在投影坐標中生成數據有一定的了解。作為替代方案,您可以設置 default_crs = sf::st_crs(4326)
,即 1984 年世界大地測量係統 (WGS84)。這意味著 x 和 y 位置分別被解釋為經度和緯度。您還可以指定任何其他有效的 CRS 作為非 sf 幾何對象的默認 CRS。
非 sf 幾何出現的第二個問題是,當 default_crs
未設置為 NULL
時,如何在投影空間中解釋直線。 coord_sf()
采用的方法是將直線分成小塊(即,將它們分段),然後將這些塊轉換為投影坐標。對於 x 和 y 被解釋為經度和緯度的默認設置,此方法意味著水平線遵循平行線,垂直線遵循經線。如果您需要不同的方法來處理直線,那麽您應該手動分段和投影坐標並在投影坐標中生成繪圖。
例子
if (requireNamespace("sf", quietly = TRUE)) {
nc <- sf::st_read(system.file("shape/nc.shp", package = "sf"), quiet = TRUE)
ggplot(nc) +
geom_sf(aes(fill = AREA))
# If not supplied, coord_sf() will take the CRS from the first layer
# and automatically transform all other layers to use that CRS. This
# ensures that all data will correctly line up
nc_3857 <- sf::st_transform(nc, 3857)
ggplot() +
geom_sf(data = nc) +
geom_sf(data = nc_3857, colour = "red", fill = NA)
# Unfortunately if you plot other types of feature you'll need to use
# show.legend to tell ggplot2 what type of legend to use
nc_3857$mid <- sf::st_centroid(nc_3857$geometry)
ggplot(nc_3857) +
geom_sf(colour = "white") +
geom_sf(aes(geometry = mid, size = AREA), show.legend = "point")
# You can also use layers with x and y aesthetics. To have these interpreted
# as longitude/latitude you need to set the default CRS in coord_sf()
ggplot(nc_3857) +
geom_sf() +
annotate("point", x = -80, y = 35, colour = "red", size = 4) +
coord_sf(default_crs = sf::st_crs(4326))
# To add labels, use geom_sf_label().
ggplot(nc_3857[1:3, ]) +
geom_sf(aes(fill = AREA)) +
geom_sf_label(aes(label = NAME))
}
# Thanks to the power of sf, a geom_sf nicely handles varying projections
# setting the aspect ratio correctly.
if (requireNamespace('maps', quietly = TRUE)) {
library(maps)
world1 <- sf::st_as_sf(map('world', plot = FALSE, fill = TRUE))
ggplot() + geom_sf(data = world1)
world2 <- sf::st_transform(
world1,
"+proj=laea +y_0=0 +lon_0=155 +lat_0=-90 +ellps=WGS84 +no_defs"
)
ggplot() + geom_sf(data = world2)
}
相關用法
- R ggplot2 ggsave 使用合理的默認值保存 ggplot (或其他網格對象)
- R ggplot2 ggplot 創建一個新的ggplot
- R ggplot2 ggtheme 完整的主題
- R ggplot2 gg-add 將組件添加到圖中
- R ggplot2 ggproto 創建一個新的 ggproto 對象
- R ggplot2 geom_qq 分位數-分位數圖
- R ggplot2 geom_spoke 由位置、方向和距離參數化的線段
- R ggplot2 geom_quantile 分位數回歸
- R ggplot2 geom_text 文本
- R ggplot2 get_alt_text 從繪圖中提取替代文本
- R ggplot2 geom_ribbon 函數區和麵積圖
- R ggplot2 geom_boxplot 盒須圖(Tukey 風格)
- R ggplot2 geom_hex 二維箱計數的六邊形熱圖
- R ggplot2 geom_bar 條形圖
- R ggplot2 guide_legend 圖例指南
- R ggplot2 geom_bin_2d 二維 bin 計數熱圖
- R ggplot2 geom_jitter 抖動點
- R ggplot2 geom_point 積分
- R ggplot2 geom_linerange 垂直間隔:線、橫線和誤差線
- R ggplot2 geom_blank 什麽也不畫
- R ggplot2 guides 為每個尺度設置指南
- R ggplot2 geom_path 連接觀察結果
- R ggplot2 geom_violin 小提琴情節
- R ggplot2 guide_bins Guide_legend 的分箱版本
- R ggplot2 geom_dotplot 點圖
注:本文由純淨天空篩選整理自Hadley Wickham等大神的英文原創作品 Visualise sf objects。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。