當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


R ggplot2 ggsf 可視化 sf 對象


這組 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" 可能會導致意外結果。它允許在繪圖上的任何位置繪製數據點,包括繪圖邊。如果通過 xlimylim 設置限製,並且某些數據點超出這些限製,則這些數據點可能會顯示在軸、圖例、繪圖標題或繪圖邊距等位置。

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永遠不會從劇情中繼承。

CRS

coord_sf() 確保所有層都使用通用的 CRS。您可以使用 crs 參數指定它,或者 coord_sf() 將從定義 CRS 的第一層獲取它。

結合 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)
}

相關用法


注:本文由純淨天空篩選整理自Hadley Wickham等大神的英文原創作品 Visualise sf objects。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。