ggplot2 的 ggproto 中 "non_missing_aes" 的功能是什么?
What is the functionality of "non_missing_aes" in ggproto of ggplot2?
我在写ggplot2
的扩展,发现ggproto
中新增了一个non_missing_aes
参数,[=11=的官方文档中没有解释]和扩展ggplot2
的官方指南,谁能告诉我它的功能,以及required_aes
之间的区别?谢谢!
TLDR
require_aes
指定必须存在的美学映射 before 将 geom_*()
或 stat_*()
中的所有内容传递到 ggproto 对象中,而 non_missing_aes
指定必须存在的美学映射 在 所述 ggproto 对象中定义的不同函数的必要处理步骤之后。
更长的解释
既然你在写扩展,我假设你熟悉数据帧是如何传递到 ggplot()
并被每个相关层继承(或直接传递到每个层),然后传递到相关的 Geom / 统计 ggproto 对象并沿途进行转换。
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
中列出的美学映射 NOT 必须由用户在生成 ggplot 对象时指定,因此相应的列可能从一开始就不存在于数据框中。
对于 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_*()
中的美学映射会触发错误:
Error: geom_* requires the following missing aesthetics: some_aes_or_other
我在写ggplot2
的扩展,发现ggproto
中新增了一个non_missing_aes
参数,[=11=的官方文档中没有解释]和扩展ggplot2
的官方指南,谁能告诉我它的功能,以及required_aes
之间的区别?谢谢!
TLDR
require_aes
指定必须存在的美学映射 before 将 geom_*()
或 stat_*()
中的所有内容传递到 ggproto 对象中,而 non_missing_aes
指定必须存在的美学映射 在 所述 ggproto 对象中定义的不同函数的必要处理步骤之后。
更长的解释
既然你在写扩展,我假设你熟悉数据帧是如何传递到 ggplot()
并被每个相关层继承(或直接传递到每个层),然后传递到相关的 Geom / 统计 ggproto 对象并沿途进行转换。
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
中列出的美学映射 NOT 必须由用户在生成 ggplot 对象时指定,因此相应的列可能从一开始就不存在于数据框中。
对于 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_*()
中的美学映射会触发错误:
Error: geom_* requires the following missing aesthetics: some_aes_or_other