R 在ggplot2中绘制累积计数
有一些关于在ggplot中绘制累积密度的帖子。我目前正在使用来自的已接受答案绘制累积计数。但是这个解决方案需要预先计算这些值 在这里,我正在寻找一个纯ggplot解决方案。让我们展示一下我目前所拥有的: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.. * .
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))