首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"non_missing_aes“在ggplot2的ggproto中有什么功能?

"non_missing_aes“在ggplot2的ggproto中有什么功能?
EN

Stack Overflow用户
提问于 2018-04-09 01:40:32
回答 1查看 202关注 0票数 4

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-03 10:57:03

TLDR

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

较长解释

由于您正在编写扩展,我假设您熟悉如何将数据帧传递到ggplot()中,并由每个相关层继承(或直接传递到每个层),然后传递到相关的Geom / Stat对象,并在此过程中进行转换。

non_missing_aesrequired_aes作为数据转换过程的一部分在Geom$handle_naStat$compute_layer函数中被引用,默认情况下,所有其他Geoms & Stats都是从这些函数继承的。

更具体地说,non_missing_aes是在remove_missing函数中找到的,如下所示(为了清楚起见,我在下面添加了函数参数名称):

代码语言:javascript
复制
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上的实际代码):

代码语言:javascript
复制
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

代码语言:javascript
复制
required_aes = c("x", "y"),
non_missing_aes = "fill",
default_aes = aes(fill = "grey20", alpha = NA),
...

GeomSegment

代码语言:javascript
复制
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

代码语言:javascript
复制
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 ):

代码语言:javascript
复制
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_aesnon_missing_aes中的所有列都应该出现,但由于并非所有列都是用户从一开始就输入的,所以我们不能在required_aes中指定所有这些列,因为在required_aes中列出但在geom_*() / stat_*()中不存在的任何美学映射都会触发一个错误:

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49724484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档