R, сравнить определенные значения указанного c периода (например, апрель - следующий март) с предыдущим годом - PullRequest
0 голосов
/ 06 марта 2020

Я хотел бы создать линейный график для сравнения, скажем, качества воздуха с 2019-04 по 2020-03 годы, с 2018-04 по 2019-03 годы.

Я выполнил поиск, но не сделал не найти никакого решения. Любое предложение будет оценено!

1 Ответ

2 голосов
/ 06 марта 2020

Это можно сделать несколькими способами. Я использовал набор данных 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")

enter image description here


Вариант 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))

enter image description here

Первый период (красным цветом) находится на верхней панели.


Первая версия : Возможно, что-то вроде этого?

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"

enter image description here


Редактировать : 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")

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...