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