12.15 日历图

airquality 数据集记录了1973年5月至9月纽约的空气质量,包括气温(华氏度)、风速(米/小时)、紫外线强度、臭氧含量四个指标,图 12.54 展示了每日的气温变化。

airquality %>%
  transform(Date = seq.Date(
    from = as.Date("1973-05-01"),
    to = as.Date("1973-09-30"), by = "day"
  )) %>%
  transform(
    Week = as.integer(format(Date, "%W")),
    Year = as.integer(format(Date, "%Y")),
    Weekdays = factor(weekdays(Date, abbreviate = T),
      levels = c("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")
    )
  ) %>%
  ggplot(aes(x = Week, y = Weekdays, fill = Temp)) +
  scale_fill_distiller(name = "Temp (F)", palette = "Spectral") +
  geom_tile(color = "white", size = 0.4) +
  facet_wrap("Year", ncol = 1) +
  scale_x_continuous(
    expand = c(0, 0),
    breaks = seq(1, 52, length = 12),
    labels = month.abb
  )
1973年5月至9月纽约的气温变化

图 12.54: 1973年5月至9月纽约的气温变化

12.54 横轴的刻度标签换成了月份,一个月为四周,一年 52~53 周,每周的第一天约定为星期一,1973年05月01日为星期二。代码中颇为技巧的在于 format() 函数从 Date 日期类型的数据提取第几周, 用 weekdays() 函数提取星期几,而 month.abb 则是一个内置常量,12个月份的英文缩写。在调用其它 R 包处理日期数据时要特别小心,要留意一周的的第一天是星期几,有的是星期一,有的是星期日,这往往和宗教信仰相关,星期日在西方也叫礼拜天。 上面 Base R 提供的日期函数认为一周的第一天是星期一,而调用 data.table 的话,默认一周是从星期日(礼拜天)开始的。

# https://d.cosx.org/d/421230
weekdays(Sys.Date(), abbreviate = TRUE)
## [1] "Thu"
data.table::wday(Sys.Date())
## [1] 5