ggplot2中的geoms和stats有什么区别?

时间:2016-08-04 19:18:56

标签: r plot ggplot2

可以使用geoms和stats在R包ggplot2中制作图,并且它们通常会给出类似的结果(例如,geom_area和stat_bin)。它们通常也有不同的论点,例如:在2-D density plots中:

geom_density_2d(mapping = NULL, data = NULL, stat = "density2d",
  position = "identity", ..., lineend = "butt", linejoin = "round",
  linemitre = 1, na.rm = FALSE, show.legend = NA, inherit.aes = TRUE)

stat_density_2d(mapping = NULL, data = NULL, geom = "density_2d",
  position = "identity", ..., contour = TRUE, n = 100, h = NULL, na.rm =
  FALSE, show.legend = NA, inherit.aes = TRUE)

两种类型的物体之间是否存在根本差异?

3 个答案:

答案 0 :(得分:21)

这只是为了补充已接受的答案。

ggplot2的作者Hadley Wickkam在他的着作“ggplot2:数据分析的优雅图形”中表示。 (link here)在第2页。第5.2节'逐层建立一个地块' :

  

你只需要设置stat和geom中的一个:每个geom都有一个默认的stat,每个stat都有一个默认的geom。

上面接受的答案解释了为什么两者不同。这是为了解释为什么它们在实践中难以区分 - 无论何时使用geom层,你也隐式使用stat层(即使它只是身份转换);同样,无论何时使用stat图层,您都隐式使用geom图层。

如果对任一层使用的默认值都没问题,那么明确说明两个层将是多余的。即使您对任一图层提供的默认值都不满意,您也可以将默认值修改为每个图层的参数(即您可以将默认geom修改为参数以传递给任何stat_*函数,并且您可以修改默认stat作为传递给任何geom_*函数的参数)。用Hadley Wickham的话来说(与上面相同):

  

您可以在...中传递参数(在这种情况下,stat和geom参数会自动分开)

这在概念上很难理解,这就是我也有这个问题的原因。在他的关于ggplot2 found here的基础哲学的论文中,在第4节中,默认的层次结构',Hadley Wickham在简化代码方面解释了这种默认行为背后的实际考虑因素,否则将不必要地长。

例如,没有默认规范,仅使用图形语法,简单散点图的代码可能如下所示:

ggplot() +
layer(
data = diamonds, mapping = aes(x = carat, y = price),
geom = "point", stat = "identity", position = "identity"
) +
scale_y_continuous() +
scale_x_continuous() +
coord_cartesian()

使用比例和坐标的默认值,我们可以写一些代码,如:

ggplot(data = Diamonds, aes(x = carat, y = price)) + 
layer(
geom = "point", stat = "identity", position = "identity"
)

但这仍然是仍然当然很烦人,因为statposition的值只是"identity",这基本上意味着&#39}什么' - 那么为什么要明确说出来呢?

但是,layer()函数没有statposition的默认值 - 需要在调用layer()函数时明确指定它们。 / p>

为了解决这个问题,Hadley将geom_*函数和stat_*函数作为wrappers函数发送到layer()函数,它们具有geom的默认值1}}和stat参数。 stat_*geom_*函数之间的区别在于哪个参数具有不可变(不可更改)默认值statgeom

来源:http://ggplot2.tidyverse.org/reference/layer.html

因此对于geom_*函数,您可以更改stat参数的默认值,但不能更改geom参数的默认值,而对于stat_*函数,您可以可以更改geom参数的默认值,但不能更改stat参数的默认值。

  

图层是数据,stat和geom的组合,具有潜在的位置调整。通常使用geom_*stat_*调用创建图层,但也可以使用此函数[layer()函数]直接创建图层。

答案 1 :(得分:13)

geoms代表“几何对象”。这些是您在绘图中看到的核心元素,对象如点,线,区域,曲线。

统计数据代表“统计变革”。这些对象以不同的方式汇总数据,例如计算观察值,创建最适合数据的黄土线,或者向黄土线添加置信区间。

由于geoms是绘图的“核心”,因此这些是必需的对象。另一方面,生成情节不需要统计数据,但可以大大提高最终情节。

正如@ eipi10在评论中指出的那样,这些区别在某种程度上是概念性的,因为大多数geoms在绘制之前经历了一些统计变换。其中包括geom_bargeom_smoothgeom_quantile。数据以“原始”形式呈现的一些常见例外是geom_pointgeom_line以及不太常用的geom_rug

答案 2 :(得分:1)

geom用于几何表示,而stat用于统计信息和表示。我认为geom有时会使用某些统计信息功能,例如stat_count()使用的geom_bar()。在这种情况下,geom_bar使用一个参数(x或y),而stat_count负责频率计数。