使用ggplot2在同一图中绘制ECDF。

15

我有一个数据框,经过应用melt函数后看起来类似于:

 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图(ecdf(a),ecdf(b),ecdf(c)),但是我做不到。我尝试了以下方法:

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

但是我遇到了一个错误:arguments imply differing number of rows: 34415, 0.

有人知道如何解决吗?图形应该与plot(ecdf(x))返回的类似,而不是阶梯状的。

谢谢!


3
请注意,您永远不应在aes内部使用$ - hadley
2
请参考https://dev59.com/fHA65IYBdhLWcg3w9DmF#12762919,这可能是目前使用ggplot2绘制CDF的最佳方法。 - Faheem Mitha
3个回答

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))

enter image description here

如果您想要对ECDF进行平滑估计,您还可以使用geom_smoothspline包中的ns()函数:

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))

@Joran,我得到了一张漂亮的图表。谢谢。没有平滑处理时已经很好了,但现在完美了 :) - agatha
抱歉,我没有看到你的回答,Joran。 - Ramnath
+1 对于 stat_ecdf 很棒!好知道。 - Eduardo

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)

需要使用库(reshape)。 - EngrStudent

3
这里是一种方法。
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))

这对于在同一图上绘制密度函数非常有用,但是我正在寻找类似于:http://mikelove.wordpress.com/category/visualization/page/2/ 的东西,即黑色曲线,而不是红色曲线。我希望像您绘制密度函数那样绘制cdf函数,但我没有成功。 - agatha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接