R语言 使用ggplot2绘制时间序列数据:按年分组,仅在y轴上绘制月和日

erhoui1w  于 2023-11-14  发布在  其他
关注(0)|答案(2)|浏览(175)

我尝试用ggplot在两年内测量的变量var绘制一个线形图。两年内的观测值应该在同一面板中显示在彼此的顶部。换句话说:x轴应该只显示月和日的信息,而年应该用于分组。我的数据看起来像这样:

# libraries
library(dplyr)
library(ggplot2)

# dummy data
dat <- data.frame(date = c(seq(as.Date("2021-06-01"),
                               as.Date("2021-08-01"),
                               by = "1 day"),
                           seq(as.Date("2022-05-15"),
                               as.Date("2022-07-15"),
                               by = "1 day"))) %>%
  mutate(var = sample(1:10, length(date), replace = T)) %>%
  mutate(year = format(date, "%Y"))

字符串
我目前有这个代码导致每年的小平面图。然而,如前所述,我想在同一面板中有2021年和2022年的线。

ggplot(dat, aes(x = date, y = var, group = year)) +
  facet_wrap(~year, scales = "free_x") +
  geom_line(aes(color = year))


输出量:


的数据

bkhjykvo

bkhjykvo1#

这里有两个解决方案:

假约会

基于斯特凡的解决方案,但有点更普遍化。

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

dat %>%
  mutate(fake_date = make_date(year = min(year(date)), day = day(date), month = month(date))) %>%
  ggplot(aes(x = fake_date)) + 
  geom_line(aes(y = var, col = year))

字符串
x1c 0d1x的数据

使用年份网格

这一个涉及到一个简单的连接到一个完整的366天的网格和格式的数字规模手动看起来像一个日期。

day_grid <- tibble(day = 1:366)

day_grid %>%
  right_join({
    dat %>%
      mutate(day = yday(date))    
  }, 
  by = "day") %>%
  ggplot(aes(x = day, y = var)) + 
  geom_line(aes(col = year)) + 
  scale_x_continuous(labels = \(x) format(as_date(x), "%b-%d"))



创建于2023-10-28使用reprex v2.0.2

siotufzp

siotufzp2#

你可以创建一个假的日期变量,用同一个基年替换真实的年份,例如,在下面的代码中,我选择了2021年作为基年:

library(ggplot2)
library(dplyr, warn.conflicts = FALSE)

set.seed(123)

dat <- dat |>
  mutate(
    date1 = if_else(year == 2022, date - lubridate::years(1), date)
  )

ggplot(dat, aes(x = date1, y = var, group = year)) +
  geom_line(aes(color = year)) +
  scale_x_date(date_labels = "%b %d")

字符串


的数据

相关问题