2016-10-17 28 views
6

tôi tạo ra một chuỗi thời gian giả xts đối tượng với dữ liệu bị mất tích vào ngày 2015/2/9 như:Phân biệt giá trị còn thiếu từ dữ liệu chính trong một âm mưu sử dụng R

library(xts) 
library(ggplot2) 
library(scales) 

set.seed(123) 
seq <- seq(as.POSIXct("2015-09-01"),as.POSIXct("2015-09-02"), by = "1 hour") 
ob1 <- xts(rnorm(length(seq),150,5),seq) 
seq2 <- seq(as.POSIXct("2015-09-03"),as.POSIXct("2015-09-05"), by = "1 hour") 
ob2 <- xts(rnorm(length(seq2),170,5),seq2) 
final_ob <- rbind(ob1,ob2) 
plot(final_ob) 
# with ggplot 
df <- data.frame(time = index(final_ob), val = coredata(final_ob)) 
ggplot(df, aes(time, val)) + geom_line()+ scale_x_datetime(labels = date_format("%Y-%m-%d")) 

Sau khi âm mưu dữ liệu của tôi trông như thế này: enter image description here

Phần hình chữ nhật màu đỏ thể hiện ngày mà dữ liệu bị thiếu. Làm cách nào để hiển thị dữ liệu bị thiếu vào ngày này trong cốt truyện chính?

Tôi nghĩ tôi nên hiển thị dữ liệu bị thiếu này với màu khác. Nhưng, tôi không biết làm thế nào tôi nên xử lý dữ liệu để phản ánh hành vi dữ liệu bị thiếu trong cốt truyện chính.

+4

Cảm ơn ví dụ tái tạo tuyệt vời. –

+0

http://stackoverflow.com/questions/3321489/r-ggplot-plotting-irregular-time-series hoặc có thể http://stackoverflow.com/questions/21529332/how-to-not-plot-gaps-in- timeseries-with-r –

Trả lời

7

Cảm ơn ví dụ tái sản xuất tuyệt vời. Tôi nghĩ bạn nên bỏ qua dòng đó trong phần "thiếu" của bạn. Nếu bạn có một đường thẳng (ngay cả trong một màu sắc khác nhau) nó cho thấy rằng dữ liệu được thu thập trong khoảng thời gian đó, đã xảy ra để rơi vào đường thẳng đó. Nếu bạn bỏ qua dòng trong khoảng thời gian đó thì rõ ràng là không có dữ liệu ở đó.

Sự cố là bạn muốn dữ liệu hàng giờ được kết nối theo đường và sau đó không có dòng nào trong phần "thiếu dữ liệu" - vì vậy bạn cần một số cách để phát hiện phần dữ liệu bị thiếu.

Bạn chưa đưa ra một tiêu chí cho điều này trong câu hỏi của bạn, do đó, dựa trên ví dụ của bạn, tôi sẽ nói rằng mỗi dòng trên cốt truyện phải bao gồm dữ liệu theo các khoảng thời gian theo giờ; nếu có thời gian nghỉ hơn một giờ thì sẽ có một dòng mới. Bạn sẽ phải điều chỉnh tiêu chuẩn này cho vấn đề cụ thể của mình. Tất cả những gì chúng tôi đang làm là chia nhỏ khung dữ liệu của bạn thành các bit được vẽ theo cùng một dòng.

Vì vậy, đầu tiên tạo ra một biến mà nói đó "nhóm" (tức là dòng) mỗi dữ liệu trong:

df$grp <- factor(c(0, cumsum(diff(df$time) > 1))) 

Sau đó, bạn có thể sử dụng các thẩm mỹ group=geom_line sử dụng để chia tay dòng:

ggplot(df, aes(time, val)) + geom_line(aes(group=grp)) + # <-- only change 
    scale_x_datetime(labels = date_format("%Y-%m-%d")) 

enter image description here

+0

Cảm ơn rất nhiều :) –

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