我正在学习使用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")
答案 0 :(得分:26)
试试这个:
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")
由于您说“日期”的时间超过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
进行了分组。