Ggplot2 график временных рядов: как опустить периоды, когда нет точек данных? - программирование

Ggplot2 график временных рядов: как опустить периоды, когда нет точек данных?

У меня есть временной ряд с несколькими днями данных. Между каждым днем ​​есть один период без точек данных. Как я могу опустить эти периоды при построении временных рядов с помощью ggplot2?

Искусственный пример, показанный ниже, как я могу избавиться от двух периодов, в которых нет данных?

код:

Time = Sys.time()+(seq(1,100)*60+c(rep(1,100)*3600*24, rep(2, 100)*3600*24, rep(3, 100)*3600*24))
Value = rnorm(length(Time))
g <- ggplot() 
g <- g + geom_line (aes(x=Time, y=Value))
g

enter image description here

4b9b3361

Ответ 1

Сначала создайте переменную группировки. Здесь две группы различаются, если разница во времени больше 1 минуты:

Group <- c(0, cumsum(diff(Time) > 1))

Теперь три различные панели могут быть созданы с использованием facet_grid и аргумента scales = "free_x":

library(ggplot2)
g <- ggplot(data.frame(Time, Value, Group)) + 
  geom_line (aes(x=Time, y=Value)) +
  facet_grid(~ Group, scales = "free_x")

enter image description here

Ответ 2

Проблема в том, что, как ggplot2 знает, что у вас отсутствуют значения? Я вижу два варианта:

  • Разделите свои временные ряды значениями NA
  • Добавьте дополнительную переменную, представляющую "группу". Например,

    dd = data.frame(Time, Value)
    ##type contains three distinct values
    dd$type = factor(cumsum(c(0, as.numeric(diff(dd$Time) - 1))))
    
    ##Plot, but use the group aesthetic
    ggplot(dd, aes(x=Time, y=Value)) +
          geom_line (aes(group=type))
    

    дает

    enter image description here

Ответ 3

csgillespie упомянутое дополнение к NA, но более простой способ - добавить один NA после каждого блока:

Value[seq(1,length(Value)-1,by=100)]=NA

где -1 избегает предупреждения.