使用ggplot2显示平滑(卷积)密度

时间:2014-09-30 18:32:04

标签: r ggplot2

我正在尝试在ggplot2中显示一些与高斯内核卷积的频率。我尝试用以下方法平滑线条:

+ stat_smooth(se = F,method = "lm", formula = y ~ poly(x, 24))

没有成功。

我读了一篇文章,建议频率应该用高斯内核进行卷积。哪个ggplot2的stat_density函数(http://docs.ggplot2.org/current/stat_density.html)似乎能够生成。

但是,我似乎无法用stat_density替换我的几何体。我的代码有什么问题吗?

require(reshape2)
library(ggplot2)
library(RColorBrewer)

fileName = "/1.csv" # downloadable there: https://www.dropbox.com/s/l5j7ckmm5s9lo8j/1.csv?dl=0

mydata = read.csv(fileName,sep=",", header=TRUE)

dataM = melt(mydata,c("bins"))

myPalette <- colorRampPalette(rev(brewer.pal(11, "Spectral")))

ggplot(data=dataM,
aes(x=bins, y=value, colour=variable)) +
geom_line() + scale_x_continuous(limits = c(0, 2))

此代码生成以下图表:

enter image description here

我正在考虑平滑线条,所以看起来更像是这样:

enter image description here

(来自http://journal.frontiersin.org/Journal/10.3389/fncom.2013.00189/full

1 个答案:

答案 0 :(得分:2)

由于我的评论解决了您的问题,我将其转换为答案:

density函数进行单独测量并通过卷积计算核密度分布(高斯是默认内核)。例如,plot(density(rnorm(1000)))。您可以使用bw(带宽)参数控制平滑度。例如,plot(density(rnorm(1000), bw=0.01))

但是您的数据框已经是密度分布(类似于density函数的输出)。要生成更平滑的密度估算,您需要从基础数据开始并在其上运行density,调整bw以获得所需的平滑度。

如果您无法访问基础数据,则可以按如下方式平滑现有的密度分布:

ggplot(data=dataM, aes(x=bins, y=value, colour=variable)) + 
          geom_smooth(se=FALSE, span=0.3) + 
          scale_x_continuous(limits = c(0, 2)). 

使用span参数进行游戏,以获得所需的平滑度。