2013-01-03 2 views
14

Tôi có chuỗi thời gian với nhiều ngày dữ liệu. Giữa mỗi ngày có một khoảng thời gian không có điểm dữ liệu. Làm cách nào để bỏ qua các giai đoạn này khi vẽ chuỗi thời gian bằng cách sử dụng ggplot2?ggplot2 thời gian hàng loạt âm mưu: làm thế nào để bỏ qua thời gian khi không có điểm dữ liệu?

Ví dụ nhân tạo được hiển thị như bên dưới, làm cách nào để thoát khỏi hai giai đoạn không có dữ liệu?

mã:

Time = Sys.time()+(seq(1,100)*60+c(rep(1,100)*3600*24, rep(2, 100)*3600*24, rep(3, 100)*3600*24)) 
Value = rnorm(length(Time)) 
g <- ggplot() 
g <- g + geom_line (aes(x=Time, y=Value)) 
g 

enter image description here

Trả lời

17

Đầu tiên, tạo một biến nhóm. Ở đây, hai nhóm là khác nhau nếu sự chênh lệch thời gian lớn hơn 1 phút:

Group <- c(0, cumsum(diff(Time) > 1)) 

Bây giờ ba tấm riêng biệt có thể được tạo ra sử dụng facet_grid và lập luận scales = "free_x":

library(ggplot2) 
g <- ggplot(data.frame(Time, Value, Group)) + 
    geom_line (aes(x=Time, y=Value)) + 
    facet_grid(~ Group, scales = "free_x") 

enter image description here

+1

Chắc chắn là giải pháp tốt nhất khi bạn chỉ có một vài khối. – csgillespie

+0

Thx. Tôi đã cố gắng để làm điều này trong một cốt truyện duy nhất nhưng có vẻ như phương pháp của bạn vẫn còn chấp nhận được. Các gói khác như quantmod có thể làm điều này một cách hoàn hảo đúng, nhưng tôi đoán đây không phải là điều mà ggplot2 phải làm. – billlee1231

9

Vấn đề là làm thế nào ggplot2 biết bạn có giá trị bị thiếu? Tôi thấy hai lựa chọn:

  1. Pad ra chuỗi thời gian của bạn với NA giá trị
  2. Thêm một biến thêm đại diện cho một "nhóm". Ví dụ,

    dd = data.frame(Time, Value) 
    ##type contains three distinct values 
    dd$type = factor(cumsum(c(0, as.numeric(diff(dd$Time) - 1)))) 
    
    ##Plot, but use the group aesthetic 
    ggplot(dd, aes(x=Time, y=Value)) + 
         geom_line (aes(group=type)) 
    

    cho

    enter image description here

+0

Cảm ơn. Nhưng tôi muốn hoàn toàn loại bỏ các khoảng trống ở giữa (có nghĩa là thậm chí không được hiển thị trong trục x). – billlee1231

+3

Bạn đã không đặt nó trong câu hỏi của bạn;) Nhưng câu trả lời bạn chấp nhận là đẹp hơn cho chỉ một vài khối và đó là một trong tôi sẽ đi cho. – csgillespie

3

csgillespie đệm được đề cập bởi NA, nhưng một phương pháp đơn giản hơn là thêm một NA sau mỗi khối:

Value[seq(1,length(Value)-1,by=100)]=NA 

trong đó -1 tránh cảnh báo.