ggplot2的ggproto中“non_missing_aes”的功能是什么?

时间:2018-04-09 01:40:32

标签: r ggplot2 aes ggproto

我正在为ggplot2编写扩展程序,并发现non_missing_aes中新添加的ggproto参数未在ggplot2的官方文档中解释过延长ggplot2的官方指南,有人能告诉我它的功能,以及required_aes之间的区别吗?谢谢!

1 个答案:

答案 0 :(得分:1)

TLDR

require_aes指定在geom_*()stat_*()中的所有内容传递到ggproto对象之前,之前必须存在的美学映射。 }通过在上述ggproto对象中定义的不同功能,在必需的处理步骤之后 指定了必须存在的美学映射。

详细说明

由于您正在编写扩展,因此我假设您熟悉如何将数据帧传递到non_missing_aes并由每个相关层继承(或直接传递到每个层),然后传递给相关Geom / Stat ggproto对象并一路转化。

ggplot()non_missing_aes函数中引用

required_aesGeom$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_missingrequire_aes中列出的所有列,并且从任何被检查的列中缺失值的行将从数据框。

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

GeomBar(以下评论来自GitHub上的实际代码):

non_missing_aes

GeomRaster

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

GeomSegment

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

GeomPoint

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_aesnon_missing_aes中的所有列均应存在,但由于并非全部由从一开始就是用户,我们无法在required_aes中指定所有用户,因为required_aes中列出但geom_*() / stat_*()中不存在的任何美感映射都会触发错误:

  

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