r - R,将特定时期(例如四月-次年三月)的某些值与上一年进行比较
问题描述
我想制作折线图来比较,比如说,2019-04 到 2020-03 的空气质量,以及 2018-04 到 2019-03 的空气质量。
我做了一些搜索,但没有找到任何解决方案。任何建议将不胜感激!
解决方案
这可以通过几种方式完成。我使用了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")
推荐阅读
- swift - 版本控制系统未提供作者信息
- python - 如何防止 for 循环停止?
- python - 在 Django 中使用 iframe,不断收到“TemplateDoesNotExist”
- vue.js - 如何修复不立即执行方法的简单自定义 v-on 指令?
- android - 完全隐藏的 APK 尝试在 Play 商店中发布 apk 时
- html - 每当我添加折叠和导航栏折叠时,“ul”和“li”就会完全消失
- python - 如何对已排序的 pandas.Series 进行分组?
- android - 从 SDK 版本 28 以下的 TypeFace 创建 TypeFaceSpan
- php - Laravel 两个控制器和一个模型
- makefile - 如何执行生成规则并返回构建对象的makefile函数