2015-02-06 55 views
0

我有如下兩個時間序列:- [R ggplot顏色標記時間序列基於

y1 <- mvrnorm(50, c(3,1), matrix(c(0.5,0.3,0.3,0.3),2,2))# 2-D bivariate normal 
y2 <- mvrnorm(50, c(1,0), matrix(c(2,.1,.1,1),2,2))# another 2-D bivariate normal 
y <- rbind(y1,y2) # append the second to the end of the first 

我與ggplot繪製這些:

yd <- as.data.frame(y) 
g<- ggplot(data=yd) + 
    geom_line(aes(x=1:nrow(yd), y=yd$V1, colour= "TS1"))+ 
    geom_line(aes(x=1:nrow(yd), y=yd$V2, colour= "TS2"))+ 
    scale_colour_manual(name= "Levels", 
         values = c("TS1"= "black", 
            "TS2" ="blue"))+ 
    labs(title="Two time series")+ 
    xlab("Time") + 
    ylab("Levels") + 
    theme(legend.justification = c(1, 0), legend.position = c(1, 0)) 

Figure 1

我然後運行的分類器它爲每個時間點創建一個類標籤的數字向量。下面我繪製後綴並提供標籤向量。

Figure 2

dput(labels) 
c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L) 

我希望能夠進行顏色編碼圖1相對於從上述標籤矢量派生的類的標籤。清楚的是,我希望能夠在任何時候看到我處於什麼狀態(階級),而不僅僅是看到狀態轉移的邊界。我認爲最直觀的做法是當狀態轉移到第2級時,將背景顏色(例如從灰色變爲橙色)變爲

在ggplot中實現此功能的最佳方法是什麼?我明顯對其他解決方案建議持開放態度。

+0

在時移時用'geom_vline()'畫一條垂直線? – Andrie 2015-02-06 09:19:37

+0

但是如果我已經說了3個狀態,我不知道這個轉換是從狀態1轉換到狀態3還是從狀態1轉換到狀態2.(我明白你的意思了,但是會加上這個問題) – Rhubarb 2015-02-06 09:20:30

回答

1

您可以使用geom_ribbon添加背景顏色等內容。

# creating background data 
df_bg <- data.frame(x = c(0, rep(which(as.logical(diff(labels))), each=2), length(labels)), 
        ymin = 1.1*min(yd$V1, yd$V2), 
        ymax = 1.1*max(yd$V1, yd$V2), 
        fill = factor(rep(unique(labels), each=2))) 
# plot 
g <- ggplot(data=yd, aes(x = seq_along(V1))) + 
    geom_ribbon(data = df_bg, 
       aes(x = x, ymin=ymin, ymax=ymax, fill=fill), alpha=.2) + 
    geom_line(aes(y=V1, color="TS1")) + 
    geom_line(aes(y=V2, color="TS2")) + 
    scale_colour_manual(name= "Levels", 
         values = c("TS1"= "black", 
           "TS2" ="blue"))+ 
    labs(title="Two time series") + 
    xlab("Time") + 
    ylab("Levels") + 
    theme(legend.justification = c(1, 0), legend.position = c(1, 0)) 
+0

完美! :)我還沒有嘗試去理解代碼'?geom_ribbon',但是我正確地假設它適用於N個州嗎? – Rhubarb 2015-02-06 09:57:53

+0

是的,它也適用於N個州。 – shadow 2015-02-06 10:02:09

+0

我認爲調用中的fill = factor(rep(unique(labels),each = 2))'是硬編碼的,即如果在所描述的兩個之後有另一個狀態轉移,則它不工作。如果我正確理解你的代碼,更通用的解決方案是:'fill = factor(rep(labels [c(which(as.logical(diff(labels))),length(labels))],each = 2) – Rhubarb 2015-02-06 14:15:58