2010-08-16 31 views
5

Tôi có dữ liệu chuỗi thời gian (tôi đã đăng nó ở đây như một data.frame):Tổng số vạch bằng tháng với 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") 

gì là cách tốt nhất để vẽ này là một âm mưu thanh trong ggplot đó sẽ hiển thị tổng giá trị mỗi tháng (với tên tháng là văn bản)?

tôi có thể làm điều này bằng tay bằng cách thêm một trường tháng:

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

Sau đó, âm mưu này một cách độc lập, nhưng những tháng không được ra lệnh một cách chính xác bằng phương pháp này (? Giả sử rằng tôi cần phải tạo ra một yếu tố ra lệnh); Tôi cũng giả sử rằng có một cách "dễ dàng hơn" với ggplot.

Trả lời

12

Tôi không phải là một chuyên gia với dữ liệu chuỗi thời gian, nhưng mã này làm việc cho tôi:

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

Với gợi ý của tôi, bạn kết thúc làm nổi bật không có một dòng, và y trục đối xứng khoảng 0. Tôi đã thay đổi đường lưới nhỏ trục x thành "tháng", bởi vì thanh cho mỗi tháng kéo dài vài tuần theo mỗi hướng, điều này thực sự không có ý nghĩa đối với cách dữ liệu được tổng hợp.

Chỉnh sửa: Tất nhiên, hầu hết mã này chỉ là để tạo số tiền hàng tháng. Nếu dữ liệu ngày của bạn ở định dạng ngày, thang ngày được tự động sử dụng cho các trục. Để thay đổi lên vỡ x lớn và định dạng của họ, bạn làm như vậy với scale_x_date()

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

Xem ?strftime biết chi tiết về những gì các chuỗi định dạng có ý nghĩa.

Các vấn đề liên quan