我正在为ggplot2
编写扩展程序,并发现non_missing_aes
中新添加的ggproto
参数未在ggplot2
的官方文档中解释过延长ggplot2
的官方指南,有人能告诉我它的功能,以及required_aes
之间的区别吗?谢谢!
答案 0 :(得分:1)
require_aes
指定在geom_*()
或stat_*()
中的所有内容传递到ggproto对象之前,之前必须存在的美学映射。 }通过在上述ggproto对象中定义的不同功能,在必需的处理步骤之后 指定了必须存在的美学映射。
由于您正在编写扩展,因此我假设您熟悉如何将数据帧传递到non_missing_aes
并由每个相关层继承(或直接传递到每个层),然后传递给相关Geom / Stat ggproto对象并一路转化。
ggplot()
和non_missing_aes
函数中引用 required_aes
和Geom$handle_na
作为此数据转换过程的一部分,所有其他Geoms&Stats均从该函数中引用默认继承。
更具体地说,在Stat$compute_layer
函数中可以找到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 / Stats可以说明原因:
GeomBar(以下评论来自GitHub上的实际代码):
non_missing_aes
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),
...
StatYdensity(请注意,该统计信息通常与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),
...
一起使用,geom_violin
在其weight = 1
中指定了default_aes
):
required_aes = c("x", "y"),
non_missing_aes = "weight",
...
在每种情况下,non_missing_aes
中列出的美学映射都是在生成ggplot对象时用户必需指定的 NOT ,因此可能不存在相应的列从一开始就在数据框中显示。
对于GeomBar,xmin / xmax / ymin / ymax列仅在GeomBar$setup_data()
期间从 给定的数据帧中计算得出。对于其余部分,non_missing_aes
映射包含在它们各自的Geoms的default_aes
中,因此,如果用户包含类似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