Обновление: добавление границ неопределенности к исходному data.frame, который должен быть частью графика.
Я уже задавал этот вопрос раньше, но прошу еще раз узнать, есть ли другой метод затенения данных за пропущенные месяцы без соединения линий.
DF <- data.frame(Date = seq(as.Date("2000-01-01"),to = as.Date("2005-12-31"),by = "day"),
Obs = runif (2192, 5,10),
Sim = runif (2192, 8,12),
Up = runif (2192,13,15),
Low = runif (2192,1,4)) %>%
filter(between(month(Date),3,10))
ggplot(DF, aes(x = Date))+
geom_ribbon(aes(ymin = Up, ymax = Low), fill = "grey30", alpha = 0.5)+
geom_line(aes(y = Obs, col = "blue"))+
geom_line(aes(y = Sim, col = "red"))
Требуется вывод Это примерно то, что я хочу, но без линий, соединяющих недостающие месяцы.
Обновление 2: выходные данные примера границ неопределенности
Я бы, вероятно, использовал эти данные для определения времени начала и окончания любых периодов без последовательных ежедневных измерений:
library(tidyverse)
missing_months <- DF %>%
mutate(missing = c(diff(Date), 1) > 1,
missing = missing | lag(missing)) %>%
filter(missing) %>%
mutate(start_stop = rep(c("start", "stop"), length = n())) %>%
select(Date, start_stop) %>%
pivot_wider(names_from = start_stop, values_from = Date, values_fn = list) %>%
unnest(cols = c(start, stop)) %>%
mutate(start = start + 1, stop = stop - 1)
missing_months
#> # A tibble: 5 x 2
#> start stop
#> <date> <date>
#> 1 2000-11-01 2001-02-28
#> 2 2001-11-01 2002-02-28
#> 3 2002-11-01 2003-02-28
#> 4 2003-11-01 2004-02-29
#> 5 2004-11-01 2005-02-28
Чтобы линии не соединялись, вам необходимо пометить каждый последовательный прогон и использовать эту метку в качестве группирующей переменной на графике. Помните, что будет проще построить график, если данные будут представлены в длинном формате:
DF %>%
pivot_longer(c('Obs', 'Sim')) %>%
group_by(name) %>%
mutate(run = cumsum(c(0, diff(Date) > 1)), group = interaction(name, run)) %>%
ggplot() +
geom_rect(aes(xmin = start, xmax = stop, ymin = -Inf, ymax = Inf),
data = missing_months, fill = "gray30", alpha = 0.5) +
geom_ribbon(aes(group = group, x = Date, ymin = Low, ymax = Up),
fill = 'gray80') +
geom_line(aes(x = Date, y = value, color = name, group = group),
linewidth = 0.1) +
scale_color_manual(NULL, values = c("red3", "blue3", "green4", "black"),
guide = guide_legend(override.aes = list(linewidth = 1))) +
theme_bw(20)
@Hydro, так в чем проблема? Код работает так же, за исключением того, что вам нужно четыре цвета для четырех наборов.
@Hydro обновлен и теперь показывает четыре цвета вместо двух.
Привет @Allan, см. рисунок Update 2
к исходному вопросу: границы неопределенности - это не отдельные линии, которые будут иметь разную цветовую кодировку, а границы, которые охватывают наблюдение и моделирование только 95%PPU
на графике Update 2
. Up
и Low
в моем data.frame
должны быть 95%PPU
фигуры Update 2
. Надеюсь, это имеет смысл.
@Hydro, в этом случае вам нужно использовать geom_ribbon, а не поворачивать столбцы «вверх» и «низко». Смотрите мое обновление.
Спасибо @Allan, я только что обновил свой
data.frame
, так как пропустил границы неопределенности (вверх и вниз - часть фигуры. Я пробовал сам, но безуспешно.