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

Рисунок 1

Затем я запускаю классификатор, который создает числовой вектор меток классов для каждой временной точки. Ниже я рисую апостериор и предоставляю вектор метки.

Рисунок 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? Я, очевидно, открыт для других предложений по решению.


person Zhubarb    schedule 06.02.2015    source источник
comment
Нарисуйте вертикальную линию с geom_vline() во время сдвига?   -  person Andrie    schedule 06.02.2015
comment
Но если у меня, скажем, 3 состояния, я не буду знать, произошел ли сдвиг из состояния 1 в состояние 3 ИЛИ из состояния 1 в состояние 2. (Я понимаю вашу точку зрения, но добавлю это к вопросу)   -  person Zhubarb    schedule 06.02.2015


Ответы (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)) 
person shadow    schedule 06.02.2015
comment
Идеально! :) Я еще не пытался понять код ?geom_ribbon, но правильно ли я предполагаю, что это работает и для N состояний? - person Zhubarb; 06.02.2015
comment
Я думаю, что бит fill = factor(rep(unique(labels), each=2)) в вызове жестко запрограммирован, т.е. он не работает, если произошел еще один сдвиг состояния после двух изображенных. Если я правильно понимаю ваш код, более общее решение: fill = factor(rep(labels[c(which(as.logical(diff(labels))), length(labels) )], each=2)) - person Zhubarb; 06.02.2015