36

有一些关于在 ggplot 中绘制累积密度的帖子。我目前正在使用Easier way 中接受的答案来绘制 ggplot 中的累积频率分布?用于绘制我的累积计数。但是这个解决方案涉及预先计算值。

在这里,我正在寻找一个纯 ggplot 解决方案。让我们展示一下我到目前为止所拥有的:

x <- data.frame(A=replicate(200,sample(c("a","b","c"),1)),X=rnorm(200))

ggplot的stat_ecdf

我可以使用 ggplot's stat_ecdf,但它只绘制累积密度:

ggplot(x,aes(x=X,color=A)) + geom_step(aes(y=..y..),stat="ecdf")

在此处输入图像描述

我想做类似以下的事情,但它不起作用:

ggplot(x,aes(x=X,color=A)) + geom_step(aes(y=..y.. * ..count..),stat="ecdf")

cumsumstat_bin

我发现了一个关于使用cumsumand的想法stat_bin

ggplot(x,aes(x=X,color=A)) + stat_bin(aes(y=cumsum(..count..)),geom="step")

在此处输入图像描述

但是正如你所看到的,下一个颜色不是从 开始y=0,而是最后一个颜色结束的地方。

我的要求

我想要从最好到最坏的:

  1. 理想情况下,一个简单的修复不工作

    ggplot(x,aes(x=X,color=A)) + geom_step(aes(y=..y.. * ..count..),stat="ecdf")
    
  2. stat_ecdf使用计数的更复杂的方法。

  3. 最后的手段是使用该cumsum方法,因为它会给出更差(合并)的结果。
4

3 回答 3

26

这不会直接解决分组行的问题,但它会是解决方法。

您可以根据级别将三个调用添加到stat_bin()您对数据进行子集化的位置。A

ggplot(x,aes(x=X,color=A)) +
  stat_bin(data=subset(x,A=="a"),aes(y=cumsum(..count..)),geom="step")+
  stat_bin(data=subset(x,A=="b"),aes(y=cumsum(..count..)),geom="step")+
  stat_bin(data=subset(x,A=="c"),aes(y=cumsum(..count..)),geom="step")

在此处输入图像描述

更新 - 使用 geom_step() 的解决方案

另一种可能性是将 的值..y..与每个级别中的观察数相乘。目前,要获得这么多的观察结果,我发现的唯一方法是在绘图之前预先计算它们并将它们添加到原始数据框中。我命名了这个专栏len。然后在geom_step()里面aes()你应该定义你将使用变量len=len,然后将y值定义为y=..y.. * len

set.seed(123)
x <- data.frame(A=replicate(200,sample(c("a","b","c"),1)),X=rnorm(200))
library(plyr)
df <- ddply(x,.(A),transform,len=length(X))
ggplot(df,aes(x=X,color=A)) + geom_step(aes(len=len,y=..y.. * len),stat="ecdf") 

在此处输入图像描述

于 2013-08-22T12:51:25.190 回答
10

您可以应用row_number组,并将其用作geom_step几何图形或其他几何图形中的 Y 美学。您只需按 排序X,否则这些值将像它们在数据框中一样显示,无序。

ggplot(x %>% 
         group_by(A) %>% 
         arrange(X) %>% 
         mutate(rn = row_number())) + 
  geom_step(aes(x=X, y=rn, color=A))

按组累计计数

于 2018-10-16T19:11:12.403 回答
1

如何使用ave()按组获取累积总和?

ggplot(x[order(x$X),], aes(x = X, y = ave(A == A, A, FUN = cumsum), col = A)) + geom_step()

在此处输入图像描述

于 2022-02-01T08:51:39.437 回答