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]()
Ответы
Ответ 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 избегает предупреждения.