使用ggplot2绘制累积图

17
我正在学习如何使用 ggplot2,并且正在寻找能够重现下方 base::plot 结果的最小化 ggplot2 代码。我尝试了一些方法,但它们都非常冗长,因此我正在寻找最简单的表达方式,并希望将日期显示在x轴上(以下的plot没有显示日期)。
df = data.frame(date = c(20121201, 20121220, 20130101, 20130115, 20130201),
                val  = c(10, 5, 8, 20, 4))
plot(cumsum(rowsum(df$val, df$date)), type = "l")
3个回答

35

尝试这个:

ggplot(df, aes(x=1:5, y=cumsum(val))) + geom_line() + geom_point()

图片描述

如果你不需要它,只需去掉geom_point()

编辑:由于你需要按照日期标签绘制数据,你可以使用x=1:5进行绘图,并使用scale_x_discretelabels设置为新的data.frame。 以df为例:

ggplot(data = df, aes(x = 1:5, y = cumsum(val))) + geom_line() + 
        geom_point() + theme(axis.text.x = element_text(angle=90, hjust = 1)) + 
        scale_x_discrete(labels = df$date) + xlab("Date")

enter image description here

因为你说“日期”会有多个 “val” 值,所以你可以先使用例如 plyr 进行聚合。

require(plyr)
dd <- ddply(df, .(date), summarise, val = sum(val))

然后,您可以使用以下命令替换x = 1:5x = seq_len(nrow(dd))


“最好的情况是希望在x轴上有日期(但下面的图中没有显示出来)。” - eddi
我也尝试编辑您的帖子,以修复每个日期有多个val的情况,但编辑未能通过。 - eddi
谢谢!只需在df中添加另一个与相同日期和一些val的条目,然后查看plot输出。它将是val的累积每日总和。 - eddi
我会标记这个问题已回答,但请为将来修复“rowsum”部分。不能说这很漂亮,但还是谢谢 :) - eddi
我不确定你的困惑是什么。这是同一日期的两个不同值,我对值的累积总和图感兴趣,但是按日期索引,而不是观察(这就是你所做的)。我更新了我的帖子,使用稍微修改过的版本来修复这个问题。好吧,我会问一下,ggplot2 到底是什么? - eddi
显示剩余2条评论

7

经过几年的探索,我最终决定采用以下方式:

ggplot(df, aes(as.Date(as.character(date), '%Y%m%d'), cumsum(val))) + geom_line()

3

Jan Boyer似乎在这个问题中找到了一个更为简洁的解决方案,我将其稍微缩短并与Prradep的答案结合起来,以提供一个(希望)最新的答案:

ggplot(data = df, 
   aes(x=date)) +
geom_col(aes(y=value)) +
geom_line(aes(x = date, y = cumsum((value))/5, group = 1), inherit.aes = FALSE) +
ylab("Value") + 
theme(axis.text.x = element_text(angle=90, hjust = 1))

请注意,date 不是日期格式,而是字符格式,value 已按 Prradep 在上面的回答中建议的分组。

1
也许我错过了什么 - 但这怎么更简洁了呢? - eddi

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