2012-10-28 2 views
4

Я надеялся построить два временных ряда и закрасить пространство между рядами, в соответствии с которыми серия в это время больше.Возможная ошибка в geom_ribbon

здесь является два series-- первым в кадре данных с индикатором для какой серии больше, в то время

d1 <- read.csv("https://dl.dropbox.com/s/0txm3f70msd3nm6/ribbon%20data.csv?dl=1") 

И это расплавленная серия.

d2 <- read.csv("https://dl.dropbox.com/s/6ohwmtkhpsutpig/melted%20ribbon%20data.csv?dl=1") 

который я сюжет ...

ggplot() + geom_line(data = d2, 
       aes(x = time, y = value, group = variable, color = variable)) + 
     geom_hline(yintercept = 0, linetype = 2) + 
     geom_ribbon(data = d1[d1$big == "B",], 
        aes(x = time, ymin = csa, 
         ymax = csb), 
         alpha = .25, 
         fill = "#9999CC") + 
     geom_ribbon(data = d1[d1$big == "A",], 
        aes(x = time, ymin = csb, 
         ymax = csa), 
        alpha = .25, 
        fill = "#CC6666") + 
     scale_color_manual(values = c("#CC6666" , "#9999CC")) 

, что приводит к ...

the resulting plot

почему там лишняя синяя полоса в середине сюжета?

+1

Это потому, что у вас есть пробел в данных. Чтобы сказать «ggplot» об этом пробеле и ничего не строить, вы должны прервать ленту, добавив строку данных NA в конце каждого «раздела». – Andrie

+0

На самом деле я не уверен, что это все, потому что это всего лишь две моделируемые серии случайных блужданий. почему нет красных полос между их лентами? – tomw

+1

Я второй комментарий @Andrie. Сюжет правильный. Лента соединяет точки данных. Если вы хотите удалить пробел, вам нужно создать отдельные ленты. –

ответ

8

Вот решение. Я заменил data = d1[d1$big == "B",] в первой geom_ribbon функции с:

data = rbind(d1[d1$big == "B",], 
      d1[c((which(diff(as.numeric(d1$big)) == -1) + 1), 
        (which(diff(as.numeric(d1$big)) == 1))), ]) 

Это необходимо, так как первые и последние ряды d1$big == "B" последовательностей часто содержат различные csa и csb значения. В результате есть видимая лента, соединяющая данные. Вышеупомянутая команда использует последние строки до и первые строки после этих последовательностей вместе с данными для первой ленты. Эта проблема не существует для d1$big == "A" (основание для второй ленты).

Полный код:

ggplot() + 
geom_line(data = d2, 
      aes(x = time, y = value, group = variable, color = variable)) + 
geom_hline(yintercept = 0, linetype = 2) + 
geom_ribbon(data = rbind(d1[d1$big == "B",], 
          d1[c((which(diff(as.numeric(d1$big)) == -1) + 1), 
           (which(diff(as.numeric(d1$big)) == 1))), ]), 
      aes(x = time, ymin = csa, ymax = csb), 
      alpha = .25, fill = "#9999CC") + 
geom_ribbon(data = d1[d1$big == "A",], 
      aes(x = time, ymin = csb, ymax = csa), 
      alpha = .25, fill = "#CC6666") + 
scale_color_manual(values = c("#CC6666" , "#9999CC")) 

enter image description here

+0

блестящий, спасибо Свен. это очень аккуратное использование diff – tomw

+0

У меня не было понятия, как включить это для моего собственного сюжета, я закончил создание двух новых столбцов: 1 над и 1 под линией, заполняя пробелы NA. Это работало безупречно – Mathias711

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