Это можно сделать несколькими способами. Я использовал набор данных mydata из пакета openair , который регистрирует почасовые измерения качества воздуха в Лондоне с января 1998 года по июнь 2005 года.
Первый шаг заключается в создайте переменную «Period», определяющую два периода. Здесь я сравнил апрель 2003 года - март 2004 года с апрелем 2004 года - мартом 2005 года. Это два 12-месячных периода, которые пересекают два календарных года. Следующим шагом является изменение даты первого периода путем добавления 365 дней. Это немного «выдумка», потому что високосные годы могут быть проблемой. Но я просто замаскирую это для простоты. Если вы действительно хотите правильно выровнять дни, то может потребоваться более строгий метод (если таковой имеется - мне интересно, может ли эта помадка быть в порядке).
data <- mydata %>%
mutate(Date=as.Date(date, format="%Y-%m-%d")) %>%
group_by(Date) %>%
summarise(Ozone=mean(o3)) %>% # Aggregate to get average daily ozone (optional)
# Filter the data to be plotted
filter(Date>=as.Date("2003-04-01") & Date<=as.Date("2005-03-31")) %>%
# Create the period variable
mutate(Period=ifelse(Date<as.Date("2004-04-01"), "1", "2"),
# Modify the date for the second period to align with that of the first period (fudge)
Date=as.Date(ifelse(Period=="1", Date+365, Date), origin="1970-01-01"))
Вариант 1: Показать обе серии на тот же график.
p <- ggplot(data, aes(y=Ozone, x=Date, col=Period)) +
geom_line(lwd=1) +
scale_color_discrete(name="",
labels=c("Apr, 2003 - Mar, 2004 ", # add a gap here :)
"Apr, 2004 - Mar, 2005")) +
scale_x_date(date_breaks="months", date_minor_breaks="months", date_labels="%b")
p + theme(legend.position="bottom")
Вариант 2: фасетирование, с дополнительными вторичными осями сверху (вычтите 365 оригинальные даты).
p + facet_wrap(~Period, nrow=2) +
theme(legend.position="bottom", strip.text = element_blank()) +
scale_x_date(date_minor_breaks="months", sec.axis = sec_axis(~ . - 365))
Первый период (красным цветом) находится на верхней панели.
Первая версия : Возможно, что-то вроде этого?
data(airquality)
airquality$Period <- ifelse(airquality$Month<7, 1, 2)
library(ggplot2)
library(dplyr)
library(tidyr)
airquality %>%
mutate(Date = ISOdate(1973, Month, Day)) %>%
pivot_longer(cols=Ozone:Temp, names_to="Measurement") %>%
ggplot(aes(y=value, x=Date, color=Measurement)) +
geom_line(lwd=1) +
facet_grid(~Period, labeller=label_both, scales="free_x") # <- try without scales="free_x"
Редактировать : OP предпочел бы видеть обе группы на одном графике. Это возможно, если это имеет смысл, например, при сравнении ежедневных или среднемесячных значений для разных календарных лет, как показано в следующем примере. Один из способов сделать это - создать переменную year на основе даты, а затем изменить компонент «year» всех дат на равные.
library(openair) # For the data, "mydata"
library(lubridate) # Simplifies many date conversions (month, day)
mydata %>% # hourly air pollutant concentrations in London 1998-2005 (see help page)
mutate(Date=as.Date(date, format="%Y-%m-%d")) %>% # Remove time unit
group_by(Date) %>%
summarise(Ozone=mean(o3)) %>% # Calculate averages per day
filter(Date>=as.Date("2003-01-01") & Date<as.Date("2004-12-31")) %>% # Choose two years
mutate(Year=format(Date, "%Y"),
Date=as.Date(paste(2003, month(Date), day(Date), sep="-"))) %>% # The trick
ggplot(aes(y=Ozone, x=Date, col=Year)) +
geom_line() +
scale_x_date(date_breaks="2 months", date_labels="%b")