Итак, если я хорошо понимаю, вы пытаетесь построить статистическое описание совокупных значений каждой переменной в период с мая по октябрь 2000 - 2019 гг.
Итак, вот возможное решение рассчитать первую описательную статистику каждой переменной (используя пакет dplyr
, lubridate
, tiydr
) - я рекомендовал вам разбить этот код на несколько частей, чтобы понять все шаги.
Обычно я выделяю месяц и год даты, затем поворачиваю фрейм данных в более длинный формат, фильтрую для хранения значений только в течение интересующего периода (с мая по октябрь), вычисляю накопленную сумму сгруппированных значений. по переменным и году. Затем я создаю фиктивную дату (вставляя последовательный год с реальным месяцем и днями), чтобы рассчитать описательную статистику в зависимости от этой даты и переменной.
В целом, это дает что-то вроде этого:
library(lubridate)
library(dplyr)
library(tidyr)
mydata <- DF %>% mutate(Year = year(Date), Month = month(Date)) %>%
pivot_longer(-c(Date,Year,Month), names_to = "variable", values_to = "values") %>%
filter(between(Month,5,10)) %>%
group_by(Year, variable) %>%
mutate(Cumulative = cumsum(values)) %>%
mutate(NewDate = ymd(paste("2020", Month,day(Date), sep = "-"))) %>%
ungroup() %>%
group_by(variable, NewDate) %>%
summarise(Median = median(Cumulative),
Maximum = max(Cumulative),
Minimum = min(Cumulative),
Upper = quantile(Cumulative,0.75),
Lower = quantile(Cumulative, 0.25))
Затем вы можете получить график, похожий на ваш пример, выполнив:
library(ggplot2)
ggplot(mydata, aes(x = NewDate))+
geom_ribbon(aes(ymin = Lower, ymax = Upper), color = "grey", alpha =0.5)+
geom_line(aes(y = Median), color = "darkblue")+
geom_line(aes(y = Maximum), color = "red", linetype = "dashed", size = 1.5)+
geom_line(aes(y = Minimum), color ="red", linetype = "dashed", size = 1.5)+
facet_wrap(~variable, scales = "free")+
scale_x_date(date_labels = "%b", date_breaks = "month", name = "Month")+
ylab("Daily Cumulative Precipitation (mm)")
Выглядит ли то, что вы пытаетесь достичь?
РЕДАКТИРОВАТЬ: Добавление легенд
Добавление легенды здесь это не просто, так как вы используете разные geom
(лента, линия) с другим цветом, формой, ...
Итак, один из способов - это перегруппировать статистику, которая может быть построена с одинаковыми geom
и do:
mydata %>% pivot_longer(cols = c(Median, Minimum,Maximum), names_to = "Statistic",values_to = "Value") %>%
ggplot(aes(x = NewDate))+
geom_ribbon(aes(ymin = Lower, ymax = Upper, fill = "Upper / Lower"), alpha =0.5)+
geom_line(aes(y = Value, color = Statistic, linetype = Statistic, size = Statistic))+
facet_wrap(~variable, scales = "free")+
scale_x_date(date_labels = "%b", date_breaks = "month", name = "Month")+
ylab("Daily Cumulative Precipitation (mm)")+
scale_size_manual(values = c(1.5,1,1.5))+
scale_linetype_manual(values = c("dashed","solid","dashed"))+
scale_color_manual(values = c("red","darkblue","red"))+
scale_fill_manual(values = "grey", name = "")
Итак, это выглядит хорошо, но, как вы можете видеть, это немного странно, так как верхний / нижний немного выдвинут из основных легенд.
Другим решением является добавление условных обозначений в качестве надписей на последнюю дату. Для этого вы можете создать второй фрейм данных, указав только последнюю дату вашего первого фрейма данных:
mydata_label <- mydata %>% filter(NewDate == max(NewDate)) %>%
pivot_longer(cols = Median:Lower, names_to = "Stat",values_to = "val")
Затем, не сильно меняя часть прорисовки, вы можете сделать:
ggplot(mydata, aes(x = NewDate))+
geom_ribbon(aes(ymin = Lower, ymax = Upper), alpha =0.5)+
geom_line(aes(y = Median), color = "darkblue")+
geom_line(aes(y = Maximum), color = "red", linetype = "dashed", size = 1.5)+
geom_line(aes(y = Minimum), color ="red", linetype = "dashed", size = 1.5)+
facet_wrap(~variable, scales = "free")+
scale_x_date(date_labels = "%b", date_breaks = "month", name = "Month", limits = c(min(mydata$NewDate),max(mydata$NewDate)+25))+
ylab("Daily Cumulative Precipitation (mm)")+
geom_text(data = mydata_label,
aes(x = NewDate+5, y = val, label = Stat, color = Stat), size = 2, hjust = 0, show.legend = FALSE)+
scale_color_manual(values = c("Median" = "darkblue","Maximum" = "red","Minimum" = "red","Upper" = "black", "Lower" = "black"))
Я специально уменьшил размер текстовой надписи из-за недостатка места, чтобы вы могли увидеть их все. Но исходя из рисунка, который вы прикрепили к своему вопросу, у вас должно быть достаточно места для его работы.