R ggplot colour labelling time series based on class

不想你离开。 提交于 2019-12-11 23:47:32

问题


I have two time series as below:

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

I plot these with 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))

I then run a classifier which creates a numeric vector of class labels for each time point. Below I plot the posteriors and provide the label vector.

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)

I want to be able to colour-code Figure 1 with respect to the class labels derived from the above labels vector. To be clear, I want to be able to see what state (class) I am in at any given time, rather than just seeing the state shift boundaries. The most intuitive way of doing that I think is to change the background colour (e.g. from gray to orange) when state shifts to class 2.

What is the best way of achieving this in ggplot? I am obviously open to other solution suggestions.


回答1:


You can add something like a background color with 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)) 


来源:https://stackoverflow.com/questions/28362267/r-ggplot-colour-labelling-time-series-based-on-class

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!