首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在ggplot2中绘制累计计数

在ggplot2中绘制累计计数
EN

Stack Overflow用户
提问于 2013-08-22 20:05:15
回答 3查看 36.9K关注 0票数 35

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

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

代码语言:javascript
复制
x <- data.frame(A=replicate(200,sample(c("a","b","c"),1)),X=rnorm(200))

ggplot的stat_ecdf

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

代码语言:javascript
复制
ggplot(x,aes(x=X,color=A)) + geom_step(aes(y=..y..),stat="ecdf")

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

代码语言:javascript
复制
ggplot(x,aes(x=X,color=A)) + geom_step(aes(y=..y.. * ..count..),stat="ecdf")

cumsumstat_bin

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

代码语言:javascript
复制
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")

  • A使用带有计数的stat_ecdf的更复杂的方法。

  • 最后的办法是使用cumsum方法,因为它产生更差的(二进制)结果。
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-22 20:51:25

这不会直接解决行分组的问题,但它将是变通的。

您可以向stat_bin()添加三个调用,您可以在其中根据A级别设置数据子集。

代码语言:javascript
复制
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。然后,在aes()内部的geom_step()中,您应该定义将使用变量len=len,然后将y值定义为y=..y.. * len

代码语言:javascript
复制
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") 

票数 26
EN

Stack Overflow用户

发布于 2018-10-17 03:11:12

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

代码语言:javascript
复制
ggplot(x %>% 
         group_by(A) %>% 
         arrange(X) %>% 
         mutate(rn = row_number())) + 
  geom_step(aes(x=X, y=rn, color=A))

票数 8
EN

Stack Overflow用户

发布于 2022-02-01 08:51:39

如何使用ave()来获取分组的累积和?

代码语言:javascript
复制
ggplot(x[order(x$X),], aes(x = X, y = ave(A == A, A, FUN = cumsum), col = A)) + geom_step()

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18379933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档