【问题标题】:R- Plotting SeasonalityR- 绘制季节性
【发布时间】:2020-07-01 03:34:51
【问题描述】:

我有一个名为“马德里”的数据框,其中包含空气污染物的测量值以及日期、年份、月份和日期。有2001年到2018年的数据

data.frame':    3808224 obs. of  15 variables:
 $ date   : Date, format: "2001-08-01" "2001-08-01" "2001-08-01" ...
 $ BEN    : num  NA 1.5 NA NA NA ...
 $ CO     : num  0.37 0.34 0.28 0.47 0.39 ...
 $ EBE    : num  NA 1.49 NA NA NA ...
 $ NMHC   : num  NA 0.07 NA NA NA ...
 $ NO_2   : num  58.4 56.2 50.7 69.8 22.8 ...
 $ O_3    : num  34.5 42.2 46.3 40.7 66.3 ...
 $ PM10   : num  105 100.6 100.1 69.8 75.2 ...
 $ SO_2   : num  6.34 8.11 7.85 6.46 8.8 ...
 $ TCH    : num  NA 1.24 NA NA NA ...
 $ TOL    : num  NA 10.8 NA NA NA ...
 $ station: int  28079001 28079035 28079003 28079004 28079039 28079006 28079007 28079009 28079038 28079011 ...
 $ year   : num  2001 2001 2001 2001 2001 ...
 $ month  : num  8 8 8 8 8 8 8 8 8 8 ...
 $ day    : int  1 1 1 1 1 1 1 1 1 1 ...

我现在正在尝试创建一个显示每种污染物每月总平均值的图。因此,理想情况下,一条线/曲线将月份绘制在 x 轴上,以查看是否存在季节性。到目前为止,我已经用 dplyr 完成了这个(如下):

madrid_season <- madrid %>%
  group_by(month, year) %>%
  summarise(BEN_mean = mean(BEN, na.rm = TRUE),
            CO_mean = mean(CO, na.rm = TRUE),
            EBE_mean = mean(EBE, na.rm = TRUE),
            NMHC_mean = mean(NMHC, na.rm = TRUE),
            NO_2_mean = mean(NO_2, na.rm = TRUE),
            O_3_mean = mean(O_3, na.rm = TRUE),
            PM10_mean = mean(PM10, na.rm = TRUE),
            SO_2_mean = mean(SO_2, na.rm = TRUE),
            TCH_mean = mean(TCH, na.rm = TRUE),
            TOL_mean = mean(TOL, na.rm = TRUE)) 

然后我对平均值求和(不包括月份和年份列):

madrid_season$tot <- rowSums(madrid_season[,2:11], na.rm = TRUE)

然后我尝试绘制:

p4 <- ggplot(madrid_season, aes(x=month,y=tot))+geom_point()+geom_line()

除了这个绘制的是每年的总月平均值,而不是每年的单个月,所以我最终得到了一个看起来古怪的图。

我认为在这种情况下使用 dplyr 需要帮助(或接受其他建议!)

【问题讨论】:

  • 您想如何在情节中显示年份和月份?一个 x 轴,所有年份和月份按时间顺序排列?每年的叠加地块?每年一个小组?
  • @user2332849 是的,如果可能的话,我希望按时间顺序排列年份和月份
  • 您确定要将所有这些空气质量测量值相加吗?
  • 在 x 轴上放一个 Date 类变量,就像每个月的第一天。添加一列 as.Date(paste(year, month, "01", sep = "-")) 并将其放在 x 轴上。
  • @dejsdukes:您能否通过分享您的数据样本来重现您的问题,以便其他人可以提供帮助(请不要使用str()head() 或屏幕截图)?您可以使用 reprexdatapasta 包来帮助您。另见Help me Help you & How to make a great R reproducible example?

标签: r ggplot2 dplyr time-series


【解决方案1】:

我不建议对每个月的平均测量值求和。规模最大的测量值(这里看起来像 PM10)会淹没所有其他测量值。

您可以单独绘制每一个以查看季节性,或者重新调整为长格式并将测量结果用作 ggplot 中的一个方面。

我将使用 openair 包中的 mydata 数据集,因为您没有提供任何数据。变量与您的相似。

library(openair)

str(mydata)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   65533 obs. of  10 variables:
 $ date: POSIXct, format: "1998-01-01 00:00:00" "1998-01-01 01:00:00" ...
 $ ws  : num  0.6 2.16 2.76 2.16 2.4 3 3 3 3.36 3.96 ...
 $ wd  : int  280 230 190 170 180 190 140 170 170 170 ...
 $ nox : int  285 NA NA 493 468 264 171 195 137 113 ...
 $ no2 : int  39 NA NA 52 78 42 38 51 42 39 ...
 $ o3  : int  1 NA 3 3 2 0 0 0 1 2 ...
 $ pm10: int  29 37 34 35 34 16 11 12 12 12 ...
 $ so2 : num  4.72 NA 6.83 7.66 8.07 ...
 $ co  : num  3.37 NA 9.6 10.22 8.91 ...
 $ pm25: int  NA NA NA NA NA NA NA NA NA NA ...

library(dplyr)
library(lubridate)
library(ggplot2)

mydata %>%
  mutate(Year=factor(year(date)), Month=month(date, label = TRUE)) %>%
    group_by(Year, Month) %>%
  summarise_all(list(mean=mean), na.rm=TRUE) %>%
  ggplot(aes(y=o3_mean, x=Month, group=Year, col=Year)) +
  geom_line(lwd=1) + ylab(expression(O[3]))

所以O3的季节性很明显。

如果要绘制所有测量值,则将其重新整形为长形,并在测量值上刻面。

library(tidyr)
mydata %>%
  mutate(Year=factor(year(date)), Month=month(date, label = TRUE)) %>%
  group_by(Year, Month) %>%
  summarise_all(list(mean=mean), na.rm=TRUE) %>%
  select(-date_mean) %>%
  pivot_longer(cols=ends_with("_mean"), 
               names_to = c("measurement", ".value"), 
               names_sep="_") %>%
  ggplot(aes(y=mean, x=Month, group=Year, col=Year)) +
  geom_line() +
  facet_wrap(~measurement, scales="free") +
  scale_x_discrete(labels=function(x) substr(x, 1, 1))

【讨论】:

  • 哇,谢谢你!是的,我在发布后不久就放弃了总结它们的想法,哈哈
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-27
  • 2022-01-11
  • 2021-11-02
  • 2015-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多