使用ggplot2的累积图

时间:2013-04-05 22:53:14

标签: r ggplot2 cumulative-sum

我正在学习使用ggplot2,我正在寻找能够在下方重现ggplot2结果的最小base::plot代码。我已经尝试了一些东西而且它们最终都变得非常长,所以我正在寻找最小的表达式,并且理想地希望在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 个答案:

答案 0 :(得分:26)

试试这个:

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

enter image description here

如果您不想要,请删除geom_point()

修改:由于您需要在x标签为日期的情况下绘制数据,因此您可以使用x=1:5绘图并使用scale_x_discrete设置labels一个新的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

由于您说“日期”的时间超过1 val,因此您可以先使用plyr汇总它们。

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

然后,您可以将x = 1:5替换为x = seq_len(nrow(dd))来继续执行相同的命令。

答案 1 :(得分:5)

几年后,我决定做:

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

答案 2 :(得分:1)

Jan Boyer似乎在this question中找到了解决此问题的更简洁的方法,我将其缩短了一点,并结合了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不是日期格式,而是character,并且Prradep已经按照他在上面的答案中的建议对value进行了分组。