ggplot2密度与密度函数有何不同?

时间:2016-04-21 22:53:36

标签: r ggplot2 density-plot

为什么以下情节看起来有所不同?两种方法似乎都使用高斯内核。

ggplot2如何计算密度?

library(fueleconomy)

d <- density(vehicles$cty, n=2000)
ggplot(NULL, aes(x=d$x, y=d$y)) + geom_line() + scale_x_log10()

enter image description here

ggplot(vehicles, aes(x=cty)) + geom_density() + scale_x_log10()

enter image description here

更新

此问题的解决方案已经出现在SO here上,但ggplot2传递给R stats密度函数的具体参数仍然不清楚。

另一种解决方案是直接从ggplot2图中提取密度数据,如图here所示

1 个答案:

答案 0 :(得分:3)

在这种情况下,不是密度计算不同而是如何 应用log10转换。

首先检查密度是否相似而不进行变换

library(ggplot2)
library(fueleconomy)

d <- density(vehicles$cty, from=min(vehicles$cty), to=max(vehicles$cty))
ggplot(data.frame(x=d$x, y=d$y), aes(x=x, y=y)) + geom_line() 
ggplot(vehicles, aes(x=cty)) + stat_density(geom="line")

所以问题似乎是变革。在下面的stat_density中,似乎是 如果在密度计算之前将log10变换应用于x变量。 因此,要手动重现结果,您必须先转换变量 计算密度。例如

d2 <- density(log10(vehicles$cty), from=min(log10(vehicles$cty)), 
                                               to=max(log10(vehicles$cty)))
ggplot(data.frame(x=d2$x, y=d2$y), aes(x=x, y=y)) + geom_line() 
ggplot(vehicles, aes(x=cty)) + stat_density(geom="line") + scale_x_log10()

PS:要了解ggplot如何为密度准备数据,您可以查看代码as.list(StatDensity)导致StatDensity$compute_groupggplot2:::compute_density