ECDF使用ggplot2在同一个图上

aga*_*tha 15 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
Run Code Online (Sandbox Code Playgroud)

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

初始数据框有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()
Run Code Online (Sandbox Code Playgroud)

但我得到一个错误:参数意味着不同的行数:34415,0.

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

谢谢!

jor*_*ran 17

我的第一个想法是尝试使用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))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

如果你想ECDF的平滑估计你也可以使用geom_smooth与功能一起ns()从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")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

ggplot(mydf_m,aes(x = value)) + stat_ecdf(aes(colour = variable))
Run Code Online (Sandbox Code Playgroud)


vpi*_*ver 6

基于上面的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)
Run Code Online (Sandbox Code Playgroud)