ggplot stat_ *函数在概念上如何工作?

时间:2019-04-24 12:25:32

标签: r ggplot2

我目前正在努力弄清stat_*geom_*ggplot2之间的区别。 (请注意,这不是我要解决的特定问题,而是更多基于兴趣/理解的问题。)

简介

我目前的理解是stat_*函数对您的数据进行了转换,然后将结果传递到geom_*上进行显示。

最简单的例子是身份转换,它只是将未经转换的数据传递到geom。

ggplot(data = iris) + 
    stat_identity(aes(x = Sepal.Length, y = Sepal.Width) , geom= "point")

更实际的用例似乎是当您想使用某种转换并将结果提供给非默认几何体时,例如,如果您要绘制第一个和第三个四分位数的误差线,则可以执行以下操作:

ggplot(data = iris) + 
    stat_boxplot(aes(x=Species, y = Sepal.Length, ymax = ..upper.., ymin = ..lower..), geom = "errorbar")

问题1

那么这些转换如何/何时应用于数据集,数据如何准确地通过它们?

举个例子,假设我想进行stat_boxplot转换并绘制第三个四分位数的点,我将如何做?

我的直觉是:

ggplot(data = iris) + 
    stat_boxplot(aes(x=Species, y = ..upper..) , geom = "point")

ggplot(data = iris) + 
    stat_boxplot(aes(x=Species, y = Sepal.Length) , geom = "point")

但是

都出错
Error: geom_point requires the following missing aesthetics: y

我的猜测是stat_boxplot变换的一部分,它消耗了y美学效果,并生成了一个不包含任何y变量的数据集,但这导致了....

问题2

在哪里可以找到在stat_*转换中消耗了哪些变量,以及输出了哪些变量?也许我在错误的地方找东西,但文档对我来说似乎一点都不清晰...

1 个答案:

答案 0 :(得分:2)

有趣的问题...

作为背景信息,您可以阅读R for Data Science的this chapter,着重于图形语法。我敢肯定,哈德利·威克姆(Hadley Wickham)的book on ggplot2甚至是更好的来源,但我没有那个来源。

构建只有一层且没有任何构面的图的主要步骤是:

  1. 在输入数据上应用美学映射(在简单情况下,这是对列的选择和重命名)
  2. 在每个数据列上应用比例转换(如果有)
  3. 每个数据组的计算统计信息(在这种情况下为每个物种)
  4. 对通过Iterable..<name>..检测到的统计数据应用美学映射
  5. 应用排名调整
  6. 构建图形对象
  7. 应用坐标变换

您猜到了,第3步的行为类似于stat(name):它消耗所有美学列,并输出一个数据帧,该数据帧具有所有新计算的统计信息和组中所有恒定的列作为列。统计输出也可能与输入的行数不同。因此,确实在您的示例中,dplyr::transmute()列未传递给geom。

为此,我们想在第1步(统计之前)和第4步(geom之前)指定不同的映射。我以为这样的事情会起作用:

y

...但是不是(stat必须是字符串或Stat对象,但是stat_boxplot实际上会返回一个Layer对象,就像geom_point一样)。

注意:ggplot(data = iris) + geom_point( aes(x=Species, y=stat(upper)), stat=stat_boxplot(aes(x=Species, y=Sepal.Length)) ) 是与您的stat(upper)等效的更新符号

我可能是错的,但是我认为没有直接在ggplot中执行此操作的方法。您可以做的是提取上述过程的stat部分,并在输入ggplot()之前自行管理它:

..upper..

我承认有点不优雅...

对于问题2,它在文档中:请参见library(tidyverse) iris %>% group_by(Species) %>% select(y=Sepal.Length) %>% do(StatBoxplot$compute_group(.)) %>% ggplot(aes(Species, upper)) + geom_point() 的美学和计算变量部分