ggplot2 的 ggproto 中 "non_missing_aes" 的功能是什么?

What is the functionality of "non_missing_aes" in ggproto of ggplot2?

我在写ggplot2的扩展,发现ggproto中新增了一个non_missing_aes参数,[=11=的官方文档中没有解释]和扩展ggplot2的官方指南,谁能告诉我它的功能,以及required_aes之间的区别?谢谢!

TLDR

require_aes 指定必须存在的美学映射 beforegeom_*()stat_*() 中的所有内容传递到 ggproto 对象中,而 non_missing_aes 指定必须存在的美学映射 所述 ggproto 对象中定义的不同函数的必要处理步骤之后。

更长的解释

既然你在写扩展,我假设你熟悉数据帧是如何传递到 ggplot() 并被每个相关层继承(或直接传递到每个层),然后传递到相关的 Geom / 统计 ggproto 对象并沿途进行转换。

non_missing_aesrequired_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_aesnon_missing_aes 中列出的所有列的地方,并且任何检查列中缺少值的行都是从数据框中删除。

但是为什么要用non_missing_aes呢?为什么不在 require_aes 中指定所有此类列?看一看在 non_missing_aes 中实际指定某些内容的一些 Geoms / Stats 表明原因:

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"),
...

GeomRaster:

required_aes = c("x", "y"),
non_missing_aes = "fill",
default_aes = aes(fill = "grey20", alpha = NA),
...

GeomSegment:

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),
...

GeomPoint:

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 一起使用,它在其 default_aes 中指定 weight = 1):

required_aes = c("x", "y"),
non_missing_aes = "weight",
...

在每种情况下,non_missing_aes 中列出的美学映射 NOT 必须由用户在生成 ggplot 对象时指定,因此相应的列可能从一开始就不存在于数据框中。

对于 GeomBar,xmin / xmax / ymin / ymax 列仅在 GeomBar$setup_data() 期间从 给定数据帧计算 。对于其余部分,non_missing_aes 映射包含在它们各自的 Geoms 的 default_aes 中,因此如果用户包含 colour = <some variable in the data>geom_*() 中,否则将在稍后阶段创建列,并填充默认值。

在任何一种情况下,到 remove_missing 函数评估数据框时,required_aesnon_missing_aes 中的所有列都应该存在,但由于并非所有列都存在从一开始就由用户输入,我们不能在 required_aes 中指定所有这些,因为任何在 required_aes 中列出但不在 geom_*() / stat_*() 中的美学映射会触发错误:

Error: geom_* requires the following missing aesthetics: some_aes_or_other