R 在ggplot2中绘制累积计数

R 在ggplot2中绘制累积计数,r,ggplot2,R,Ggplot2,有一些关于在ggplot中绘制累积密度的帖子。我目前正在使用来自的已接受答案绘制累积计数。但是这个解决方案需要预先计算这些值 在这里,我正在寻找一个纯ggplot解决方案。让我们展示一下我目前所拥有的: x <- data.frame(A=replicate(200,sample(c("a","b","c"),1)),X=rnorm(200)) 我想做如下的事情,但它不起作用: ggplot(x,aes(x=X,color=A)) + geom_step(aes(y=..y.. * .

有一些关于在ggplot中绘制累积密度的帖子。我目前正在使用来自的已接受答案绘制累积计数。但是这个解决方案需要预先计算这些值

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

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

我想做如下的事情,但它不起作用:

ggplot(x,aes(x=X,color=A)) + geom_step(aes(y=..y.. * ..count..),stat="ecdf")
cumsum
stat\u bin
我发现了一个使用
cumsum
stat\u bin
的想法:

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

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

我的要求 我想从最好的到最坏的:

  • 理想情况下,一个简单的解决方案是不工作

    ggplot(x,aes(x=X,color=A)) + geom_step(aes(y=..y.. * ..count..),stat="ecdf")
    
  • 一种更为复杂的使用计数的方法
    stat\u ecdf

  • 最后一种方法是使用
    cumsum
    方法,因为它会产生更糟糕的结果

  • 这不会直接解决行分组的问题,但它将是一种解决方法

    您可以向
    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_步骤()解决方案 另一种可能性是将
    .y..
    的值与每个级别的观察数相乘。为了得到这个数量的观测值,我找到的唯一方法是在绘图之前预先计算它们,并将它们添加到原始数据框中。我将此列命名为
    len
    。然后在
    geom_step()
    内部
    aes()
    中,您应该定义您将使用变量
    len=len
    ,然后将
    y
    值定义为
    y=…ylen

    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") 
    
    set.seed(123)
    
    x您可以在组上应用
    行数
    ,并将其作为
    几何步骤
    或其他几何体中的Y美学。您只需按
    X
    进行排序,否则这些值将像在数据框中一样无序显示

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

    虽然这样做有效,但无法扩展。这个问题的动机是为了获得更多可维护/健壮的代码。或者,如果您希望避免对数据进行排序,可以使用
    mutate(rn=rank(X,ties=“max”)
    (尽管我更喜欢
    row\u number()
    )。
    ggplot(x %>% 
             group_by(A) %>% 
             arrange(X) %>% 
             mutate(rn = row_number())) + 
      geom_step(aes(x=X, y=rn, color=A))