首页 > 解决方案 > R,将特定时期(例如四月-次年三月)的某些值与上一年进行比较

问题描述

我想制作折线图来比较,比如说,2019-04 到 2020-03 的空气质量,以及 2018-04 到 2019-03 的空气质量。

我做了一些搜索,但没有找到任何解决方案。任何建议将不胜感激!

标签: rcompare

解决方案


这可以通过几种方式完成。我使用了openair包中的mydata数据集,该数据集记录了 1998 年 1 月至 2005 年 6 月期间伦敦每小时的空气质量测量值。

第一步是创建一个定义两个时期的“时期”变量。在这里,我将 2003 年 4 月 - 2004 年 3 月与 2004 年 4 月 - 2005 年 3 月进行了比较。这是两个跨越两个日历年的 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 更愿意在一张图中看到这两个组。如果有意义的话,这是可能的,例如在比较不同日历年的每日或每月平均值时,如下例所示。一种方法是根据日期创建一个年份变量,然后将所有日期的“年份”部分更改为相等。

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")

在此处输入图像描述


推荐阅读