我正在为 编写扩展ggplot2
,发现有一个新添加的non_missing_aes
参数在扩展的官方文档和官方指南中ggproto
没有解释,谁能告诉我它的功能,以及它们之间的区别?谢谢!ggplot2
ggplot2
required_aes
1 回答
TLDR
require_aes
指定在 a or中的所有内容传递到 ggproto 对象之前必须存在的美学映射,同时指定在所述 ggproto 对象中定义的不同函数的必要处理步骤之后必须存在的美学映射。geom_*()
stat_*()
non_missing_aes
更长的解释
由于您正在编写扩展,我假设您熟悉数据帧如何传递到ggplot()
每个相关层并被每个相关层继承(或直接传递到每个层),然后传递到相关的 Geom / Stat ggproto 对象并一路转换。
non_missing_aes
, 和required_aes
, 被引用为这个数据转换过程的一部分,Geom$handle_na
以及Stat$compute_layer
函数,所有其他 Geoms & Stats 默认继承自这些函数。
更具体地说,non_missing_aes
在remove_missing
函数中找到如下(为了清楚起见,我在下面添加了函数参数名称):
remove_missing(df = data,
na.rm = params$na.rm,
vars = c(self$required_aes, self$non_missing_aes),
name = snake_class(self))
从?remove_missing
,我们可以看出这是检查require_aes
或中列出的所有列的non_missing_aes
位置,并且从数据框中删除了任何已检查列中缺少值的行。
但为什么要使用non_missing_aes
?为什么不在 中指定所有此类列require_aes
?查看一些实际指定某些内容的 Geoms / Statsnon_missing_aes
表明原因:
GeomBar(以下评论来自 GitHub 上的实际代码):
required_aes = c("x", "y"),
# These aes columns are created by setup_data(). They need to be listed here so
# that GeomRect$handle_na() properly removes any bars that fall outside the defined
# limits, not just those for which x and y are outside the limits
non_missing_aes = c("xmin", "xmax", "ymin", "ymax"),
...
几何光栅:
required_aes = c("x", "y"),
non_missing_aes = "fill",
default_aes = aes(fill = "grey20", alpha = NA),
...
几何段:
required_aes = c("x", "y", "xend", "yend"),
non_missing_aes = c("linetype", "size", "shape"),
default_aes = aes(colour = "black", size = 0.5, linetype = 1, alpha = NA),
...
几何点:
required_aes = c("x", "y"),
non_missing_aes = c("size", "shape", "colour"),
default_aes = aes(shape = 19, colour = "black", size = 1.5, fill = NA,
alpha = NA, stroke = 0.5),
...
StatYdensity(请注意,此 Stat 通常与 一起使用,在其geom_violin
中指定):weight = 1
default_aes
required_aes = c("x", "y"),
non_missing_aes = "weight",
...
在每种情况下,列出的美学映射在生成 ggplot 对象时不一定由用户指定,因此相应的列可能从一开始就不存在于数据non_missing_aes
框中。
对于 GeomBar,xmin / xmax / ymin / ymax 列仅在GeomBar$setup_data()
. 对于其余部分,non_missing_aes
映射包含在它们各自的 Geoms'default_aes
中,因此如果用户包含类似in的内容,它们可能从一开始就存在,否则将在稍后阶段创建列,并填充默认值。colour = <some variable in the data>
geom_*()
在任何一种情况下,当函数评估数据框时,其中一个或中的remove_missing
所有列都应该存在,但由于并非所有列都是用户从一开始就输入的,所以我们不能在 中指定所有列,因为任何/中列出但不存在的美学映射将触发错误:required_aes
non_missing_aes
required_aes
required_aes
geom_*()
stat_*()
错误:geom_* 需要以下缺失的美学:some_aes_or_other