3

我正在为 编写扩展ggplot2,发现有一个新添加的non_missing_aes参数在扩展的官方文档和官方指南中ggproto没有解释,谁能告诉我它的功能,以及它们之间的区别?谢谢!ggplot2ggplot2required_aes

4

1 回答 1

2

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_aesremove_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 = 1default_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_aesnon_missing_aesrequired_aesrequired_aesgeom_*()stat_*()

错误:geom_* 需要以下缺失的美学:some_aes_or_other

于 2019-06-03T10:57:03.520 回答