2015-02-06 3 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

+0

Но если я скажу 3 состояния, я не буду знать, был ли сдвиг из состояния 1 в состояние 3 ИЛИ из состояния 1 в состояние 2. (Я получаю вашу точку, но добавлю это к вопросу) – Rhubarb

ответ

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

+0

Да, он должен работать и для N состояний. – shadow

+0

Я думаю, что 'fill = factor (rep (unique (label), each = 2))' бит в вызове жестко запрограммирован, то есть он не работает, если после изображенного изображения произошел сдвиг состояния. Если я правильно понимаю ваш код, более общее решение: 'fill = factor (rep (метки [c (которые (as.logical (diff (label))), length (labels))], each = 2))' – Rhubarb

Смежные вопросы