ECDF使用ggplot2在同一个图上

时间:2011-08-08 21:47:20

标签: r ggplot2

我有一个数据框,在应用融合函数后看起来类似于:

 var       val
1 a 0.6133426
2 a 0.9736237
3 b 0.6201497
4 b 0.3482745
5 c 0.3693730
6 c 0.3564962

..................

初始数据框有3列,列名为a,b,c及其关联值。 我需要在同一个图上绘图,使用ggplot为这些列中的每一列(ecdf(a),ecdf(b),ecdf(c))关联的ecdf,但我没有这样做。我试过了:

p<-ggplot(melt_exp,aes(melt_exp$val,ecdf,colour=melt_exp$var))
pg<-p+geom_step()

但是我收到一个错误:参数意味着行数不同:34415,0。

有没有人知道如何做到这一点?该图应该看起来类似于绘图返回的图(ecdf(x)),而不是阶梯状图。

谢谢!

3 个答案:

答案 0 :(得分:16)

我的第一个想法是尝试使用stat_function,但由于ecdf返回一个函数,我无法快速完成工作。相反,这是一个解决方案,要求您首先将计算值附加到数据框(使用Ramnath的示例数据):

library(plyr) # function ddply()
mydf_m <- ddply(mydf_m, .(variable), transform, ecd = ecdf(value)(value))

ggplot(mydf_m,aes(x = value, y = ecd)) + 
    geom_line(aes(group = variable, colour = variable))

enter image description here

如果您想要对ECDF进行平滑估算,您还可以将geom_smoothns()包中的函数spline一起使用:

library(splines) # function ns()
ggplot(mydf_m, aes(x = value, y = ecd, group = variable, colour = variable)) + 
    geom_smooth(se = FALSE, formula = y ~ ns(x, 3), method = "lm")

enter image description here

如上面的评论中所述,从版本0.9.2.1开始,ggplot2具有用于此目的的特定统计数据:stat_ecdf。使用它,我们只是做这样的事情:

ggplot(mydf_m,aes(x = value)) + stat_ecdf(aes(colour = variable))

答案 1 :(得分:5)

基于上面的Ramnath方法,你可以通过以下方式从ggplot2获得ecdf:

require(ggplot2)
mydf = data.frame(
   a = rnorm(100, 0, 1),
   b = rnorm(100, 2, 1),
   c = rnorm(100, -2, 0.5)
)

mydf_m = melt(mydf)

p0 = ggplot(mydf_m, aes(x = value)) + 
   stat_ecdf(aes(group = variable, colour = variable)) 
print(p0)

答案 2 :(得分:2)

这是一种方法

require(ggplot2)
mydf = data.frame(
  a = rnorm(100, 0, 1),
  b = rnorm(100, 2, 1),
  c = rnorm(100, -2, 0.5)
)

mydf_m = melt(mydf)

p0 = ggplot(mydf_m, aes(x = value)) + 
  geom_density(aes(group = variable, colour = variable)) +
  opts(legend.position = c(0.85, 0.85))