ggplot2,直方图:为什么y = ..density ..和stat ="密度"不同?

时间:2017-10-13 16:47:57

标签: r ggplot2 histogram

说我有这个数据框df

structure(list(max.diff = c(6.02, 7.56, 7.79, 7.43, 7.21, 7.65, 
8.1, 7.35, 7.57, 9.09, 6.21, 8.2, 6.82, 7.18, 7.78, 8.27, 6.85, 
6.72, 6.67, 6.99, 7.32, 6.59, 6.86, 6.02, 8.5, 7.25, 5.18, 8.85, 
5.44, 6.44, 7.85, 6.25, 9.06, 8.19, 5.08, 6.26, 8.92, 6.83, 6.5, 
7.55, 7.31, 5.83, 5.55, 4.29, 8.29, 8.72, 9.5)), class = "data.frame", row.names = c(NA, 
-47L), .Names = "max.diff")

我想使用ggplot2

将其绘制为密度图
p <- ggplot(df, aes(x = max.diff)) 
p <- p + geom_histogram(stat = "density")
print(p)

给出,

enter image description here

现在,一个天真的问题:为什么这不会给出相同的结果?

p <- ggplot(df, aes(x = max.diff)) 
p <- p + geom_histogram(aes(y = ..density..))
print(p)

enter image description here

这是因为选择binwidthbins的数量还是其他一些参数?到目前为止,我还没有能够调整这些参数以使它们相同。或者我在绘制一些完全不同的东西?

1 个答案:

答案 0 :(得分:2)

第二个示例是重新缩放直方图计数,以便条形区域与1整合,但在其他方面与标准ggplot2直方图相同。您可以使用binsbinwidth参数调整条形数。

第一个例子是计算核密度估计并绘制输出(每个x值的估计密度)作为直方图。您可以使用adjust参数更改密度估计的平滑量,以及使用n参数计算密度的点数。

geom_histogram的默认值为bins=30stat="density"的默认设置为adjust=1n=512stat="density"正在使用density函数生成值)。由于stat="density"选择密度估计带宽的方式,density输出比直方图输出更平滑。减少adjust参数会减少平滑量。

下面的前两个例子是你的情节。后两个使用对相应参数的调整来获得两个大致相似的图,但不完全相同,因为核密度估计仍然使输出平滑。这只是为了说明。核密度估计和直方图是两种不同的思想相关的东西。

ggplot(df, aes(x = max.diff)) +
  geom_histogram(stat = "density") +
  ggtitle("stat='density'; default paramters")

ggplot(df, aes(x = max.diff)) +
  geom_histogram(aes(y = ..density..), colour="white") +
  ggtitle("geom_histogram; default parameters")

ggplot(df, aes(x = max.diff)) +
  geom_histogram(stat = "density", n=2^5, adjust=0.1) +
  ggtitle("stat='density'; n=2^5; Adjust=0.1")

ggplot(df, aes(x = max.diff)) +
  geom_histogram(aes(y = ..density..), bins=2^5, colour="white") +
  ggtitle("geom_histogram; bins=2^5")

enter image description here