2010-08-16 89 views
5

我有时间序列数据(我已经在这里张贴作为一个data.frame):barplot与ggplot月总计?

x <- structure(list(date = structure(c(1264572000, 1266202800, 1277362800, 
1277456400, 1277859600, 1278032400, 1260370800, 1260892800, 1262624400, 
1262707200), class = c("POSIXt", "POSIXct"), tzone = ""), data = c(-0.00183760994446658, 
0.00089738603087497, 0.000423513598318936, 0, -0.00216496690393131, 
-0.00434836817931339, -0.0224199153445617, 0.000583823085470003, 
0.000353088613905206, 0.000470295331234771)), .Names = c("date", 
"data"), row.names = c("1", "2", "3", 
"4", "5", "6", "7", "8", "9", "10" 
), class = "data.frame") 

什么是绘制本作中ggplot柱状图,将显示每月总价值的最佳方式(月份名称为文本)?

我可以通过添加个月的实地手动执行此操作:

x$month <- format(x$date, format="%B") 
ddply(x, .(month), function(x) sum(x[, "data"])) 

然后独立绘制这一点,但使用这种方法(?假设我需要建立一个有序的因素)几个月未排序正确;我也假设ggplot有一个“更容易”的方法。

回答

12

我绝不是时间序列数据的专家,但是这个代码为我工作:

#The binning by month, saving as a date 
x$month <- as.Date(cut(x$date, breaks = "month")) 

#Plotting 
p <- ggplot(x, aes(month, data))+ 
    stat_summary(fun.y = sum, geom = "bar") 

#My suggestions for display 
minmax <- max(abs(x$data)) 

p + geom_hline(y = 0)+ 
    scale_x_date(minor = "month")+ 
    ylim(-minmax, minmax) 
    # or more ggplot2 accurately 
    #+coord_cartesian(ylim = c(-minmax, minmax)) 

随着我的建议,你最终突出为零线,与y轴对称大约为0.我将x轴小网格线更改为“月”,因为每个月的酒吧在每个方向上延长了几周,这对于数据如何聚合没有实际意义。

编辑: 当然,这些代码大部分只是创建每月的总和。如果您的日期数据采用日期格式,则日期刻度会自动用于轴。要更改主X休息和它们的格式,你scale_x_date()

p + scale_x_date(major = "month", format = "%b") 
#or 
p + scale_x_date(major = "month", format = "%B %Y") 

做到见?strftime关于什么格式字符串的意思的细节。