ggplot2和cumsum()

7

我有一组UNIX时间戳和URI,我想绘制每个URI的请求累计计数。我已经成功为一个URI使用虚拟列完成了这个操作:

x.df$count <- apply(x.df,1,function(row) 1) # Create a dummy column for cumsum
x.df <- x.df[order(x.df$time, decreasing=FALSE),] # Sort
ggplot(x.df, aes(x=time, y=cumsum(count))) + geom_line()

然而,在我的情况下,这将导致大约30个图。

ggplot2确实允许您将多条线绘制到一个图中(我从这里复制了这段代码):

ggplot(data=test_data_long, aes(x=date, y=value, colour=variable)) +
    geom_line()

问题在于,这种方式下,cumsum()会一直累加。
有人有什么想法吗?

2
你能提供一个小的数据集示例来说明你所描述的内容吗? - joran
这似乎是 plyrdata.table 的工作。将数据按 URI 拆分,然后在每个片段上使用 cumsumdata.table(x); x[, list(count=.I), by=URI] 或类似的东西... - Justin
1个回答

9

这是一个测试数据,使用plyrtransform先计算累积和,然后应用该数据使用ggplot2绘图:

set.seed(45)
DF <- data.frame(grp = factor(rep(1:5, each=10)), x=rep(1:10, 5))
DF <- transform(DF, y=runif(nrow(DF)))

# use plyr to calculate cumsum per group of x
require(plyr)
DF.t <- ddply(DF, .(grp), transform, cy = cumsum(y))

# plot
require(ggplot2)
ggplot(DF.t, aes(x=x, y=cy, colour=grp, group=grp)) + geom_line()

enter image description here


抱歉,我不明白你所说的样本数据是什么意思,因为我对R还比较陌生。虽然你的图表并没有显示出累积总和,但这些线条必须是单调的。(顺便说一句:你不需要使用cumsum来创建这种类型的线条,ECDF就可以胜任。) - Bob
1
我已经生成了一些示例数据,因为您没有提供(请参见@joran的评论)。我猜你还在看旧图? 这是单调递增的累积总和。 如果要查看点,请添加“+ geom_point()”。 - Arun
嗨,Arun,感谢你的帮助。例子运行成功了,但实际数据中我没有得到一个单调递增的图形。因此,我开始尝试在例子中更改数字,我认为大数值存在问题。你能重现这个问题吗? - Bob
3
@Bob,责任在你身上提供可重现的示例。 - mnel
2
我认为我已经找到了我的数据问题所在。如果您的数据未按递增顺序排序,则似乎无法获得单调图。 - Bob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接