当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。