我正在为ggplot2编写扩展,并发现ggproto中有一个新添加的non_missing_aes参数尚未在ggplot2的正式文档和扩展ggplot2的官方指南中解释,有人能告诉我它的功能以及required_aes之间的区别吗?谢谢!
发布于 2019-06-03 10:57:03
TLDR
require_aes指定在将geom_*()或stat_*()中的所有内容传递到ggproto对象之前必须存在的美学映射,而non_missing_aes则指定在之后必须存在的美学映射--通过在所述ggproto对象中定义的不同函数进行必要的处理步骤。
较长解释
由于您正在编写扩展,我假设您熟悉如何将数据帧传递到ggplot()中,并由每个相关层继承(或直接传递到每个层),然后传递到相关的Geom / Stat对象,并在此过程中进行转换。
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中指定所有这样的列?查看一些实际在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"),
...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一起使用,它在default_aes中指定weight = 1 ):
required_aes = c("x", "y"),
non_missing_aes = "weight",
...在每种情况下,non_missing_aes中列出的美学映射都是而不是,用户在生成ggplot对象时必须指定这些映射,因此从一开始就不可能在数据帧中存在相应的列。
对于GeomBar,xmin / xmax / ymin / ymax列只从计算GeomBar$setup_data()中给定的数据帧的。对于其余部分,non_missing_aes映射包含在各自的Geoms的default_aes中,因此,如果用户在geom_*()中包含类似colour = <some variable in the data>的内容,则可以从一开始就存在这些映射,否则将在稍后阶段创建列,并填充默认值。
在任何一种情况下,当数据帧由remove_missing函数计算时,required_aes或non_missing_aes中的所有列都应该出现,但由于并非所有列都是用户从一开始就输入的,所以我们不能在required_aes中指定所有这些列,因为在required_aes中列出但在geom_*() / stat_*()中不存在的任何美学映射都会触发一个错误:
错误: geom_*需要以下缺失的美学: some_aes_or_other
https://stackoverflow.com/questions/49724484
复制相似问题