【问题标题】:Plotting cumulative counts in ggplot2在 ggplot2 中绘制累积计数
【发布时间】:2013-08-22 12:05:14
【问题描述】:

有一些关于在 ggplot 中绘制累积密度的帖子。我目前正在使用来自Easier way to plot the cumulative frequency distribution in ggplot? 的公认答案来绘制我的累积计数。但是这个解决方案需要预先计算值。

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

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

ggplot 的stat_ecdf

我可以使用 ggplot 的 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

我发现了一个关于使用cumsumstat_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 方法,因为它会产生更差的(分箱)结果。

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

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

    您可以向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") 
    

    【讨论】:

    • 虽然这可行,但它无法扩展。这个问题的动机是获得更可维护/更健壮的代码。
    【解决方案2】:

    您可以将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))
    

    【讨论】:

    • 如果你想避免对数据进行排序,也可以使用mutate(rn = rank(X, ties = "max"))(虽然我更喜欢row_number())。
    • @jdoubleyou 回答的好处是不需要硬编码 A 的值!
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-05-12
      • 2021-05-10
      • 2021-05-04
      • 1970-01-01
      • 1970-01-01
      • 2014-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多