15

我正在学习使用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")
4

3 回答 3

32

试试这个:

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

在此处输入图像描述

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")

在此处输入图像描述

既然您说val“日期”将超过 1 个,您可以首先使用 聚合它们plyr,例如。

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

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

于 2013-04-05T22:54:25.580 回答
7

几年后,我决定做:

ggplot(df, aes(as.Date(as.character(date), '%Y%m%d'), cumsum(val))) + geom_line()
于 2016-06-07T19:32:57.173 回答
2

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它不是日期格式,而是character, 并且value已经按照Prradep在上面的回答中的建议进行了分组。

于 2018-06-28T10:00:58.343 回答