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

问题描述:

geom和stats都可以用于在R软件包ggplot2中绘制图表,并且它们通常会给出类似的结果(例如,geom_area和stat_bin)。他们也经常有稍微不同的论点,例如在2-D density plotsggplot2中的geoms和stats有什么区别?

geom_density_2d(映射= NULL,数据= NULL,STAT = “density2d”, 位置= “同一性”,...,lineend = “对接”,linejoin = “圆”, linemitre = 1,na.rm = FALSE,show.legend = NA,inherit.aes = TRUE)

stat_density_2d(mapping = NULL,data = NULL,geom =“density_2d”, position =“identity”,.. 。,轮廓= TRUE,N = 100,H = NULL,na.rm = FALSE,show.legend = NA,inherit.aes = TRUE)

这两种类型的对象之间是否有任何根本的区别?

geoms代表“几何对象”。这些是你在图上看到的核心元素,像点,线,面,曲线这样的对象。

统计数据表示“统计转换”。这些对象以不同的方式总结数据,例如计数观测数据,创建最适合数据的黄土线,或者向黄土线添加置信区间。

由于几何是情节的“核心”,这些都是必需的对象。另一方面,数据并不需要产生一个情节,但可以大大提高最终情节。

As @ eipi10在评论中注释,这些区别在某种程度上是概念性的,因为大多数geoms在绘制之前都会进行一些统计转换。这些包括geom_bargeom_smoothgeom_quantile。数据以大致“原始”形式呈现的一些常见例外是geom_pointgeom_line以及不太常用的geom_rug

+7

AFAIK统计和geoms总是一起去,但每GEOM有一个默认的统计。所以你不必明确指定一个属性,但是这个属性仍然是必需的。如果你看看[ggplot求助](http://docs.ggplot2.org/current/),你可以看到哪些统计是每个GEOM的默认。你也可以反转这个过程并在调用'stat_xxx()'的时候指定'geom'。大多数情况下,您不必担心这些细节,但如果您想要更改默认行为,则很重要。 – eipi10

+4

可能最常见的情况是'geom_bar',其中默认情况下是对行进行计数(geom_bar的默认统计是'stat_count')。因此,如果您的数据是预先汇总的,您需要指定'stat =“identity”',这意味着不对原始数据进行转换。 – eipi10

+3

感谢您的链接,我会添加一个注释,希望能更好地覆盖这种情绪。 – lmo

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

根据ggplot2的作者Hadley Wickkam在他的书“ggplot2:Elegant Analysis for Data Analysis”(link here) on page。 91,第5.2节“由层构建的情节层”的:

你只需要设置统计和GEOM之一:每GEOM有一个默认的统计,每个统计都有一个默认GEOM。

上面接受的答案很好地解释了为什么两者不同。这是为了解释为什么它们在实践中很难区分 - 无论何时使用geom层,您还隐式使用stat层(即使它只是标识转换);同样,无论何时使用统计图层,您也都隐式使用了一个geom图层。

如果你对任何一层使用的默认值都没有问题,那么明确指出两层都是多余的。即使您对任何图层提供的默认设置都不满意,您也可以将默认值修改为每个图层的参数(例如,您可以将默认geom作为参数修改为传递给任何stat_*函数的参数,并且可以将默认值修改为一个参数传递给任何geom_*函数)。哈德利韦翰的话(相同的源如上):

可以传递在... PARAMS(在这种情况下,统计和的geom参数自动挑开)

这是种难以在概念上理解,这就是为什么我也有这个问题。在他关于哲学基本GGPLOT2,found here,在第4节提出了一种“默认的层次”,哈德利韦翰解释简化代码,否则将不必要的长时间的条款背后的默认行为的实际考虑。

例如,如果没有默认规格,并使用单独的图形的语法,一个简单的散点图的代码可能看起来像:

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",whic h基本上意味着'无所事事' - 那么为什么要明确地说呢?

然而,layer()功能没有默认值statposition - 他们需要到layer()函数的调用明确指定。

为了解决这个问题,哈德利取得了geom_*功能以及作为stat_*功能wrapperslayer()函数有默认值均geomstat参数。 stat_*geom_*函数之间的差异是哪个参数具有不变的(不可更改)默认值,statgeom

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

所以对于geom_*功能,你可以改变stat参数的默认值,但不是geom参数的默认值,而对于stat_*功能,你可以改变geom的默认值参数,但不是stat参数的默认值。

一层是数据,统计和几何与潜在位置调整的组合。一般层使用geom_*stat_*呼叫创建,但它也可以直接使用该函数[在layer()函数]建立。

+1

非常感谢您解释'stat_ *'和'geom_ *'函数实际上是为'layer()'函数提供合理默认值的包装器。对我来说,这是你答案中最令人eye目结舌的方面。我的学生会(间接地)非常感谢你:-) –

+0

提到ggplot的内在哲学的好处是,这有助于理解它是如何工作的 – cloudscomputes