2013-04-05 87 views
8

我正在学习使用ggplot2并正在寻找能够再现base::plot结果的最小ggplot2代码。我已经尝试了几件事情,结果都很糟糕,所以我正在寻找最小的表达式,并且理想情况下希望在x轴上有日期(这在下面的plot中不存在) 。使用ggplot2累计绘图

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

回答

22

试试这个:

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设置labelsdata.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 = seq_len(nrow(dd))更换x = 1:5使用相同的命令进行。

+0

谢谢,这是相当长相比'plot'。 'ggplot'至少可以通过在'x'轴上添加日期来补偿自身,可能旋转了90度? :) – eddi 2013-04-08 14:53:57

+0

报价:“理想情况下希望在x轴上有日期(这些不在下面的图中)”。 – eddi 2013-04-08 20:31:48

+0

我也尝试编辑您的帖子来修复它的情况下,每个日期有超过1个val的情况,但编辑没有经过。 – eddi 2013-04-08 20:32:21

1

几年后,我已经谈妥做:

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