代码之家  ›  专栏  ›  技术社区  ›  JBurns

ggplot2 x轴,其中许多天中的每一天都有许多小时。有没有办法将x轴上的日期跨越当天的小时?

  •  1
  • JBurns  · 技术社区  · 4 月前

    我有一个运行了很多天的数据集。每一天,我都有好几个小时。在这个玩具示例中,我正在寻找3天,在这三天中的每一天,我都在查看13个小时的数据(从早上6点到下午6点)。

    我想在x轴上同时捕捉日期和小时。然而,我不想为13个小时中的每一个重复日期,而是想在这些小时内跨越日期,比如 tab_spanner 在里面 gt .

    例如,考虑以下示例代码:

    library(ggplot2)
    
    exp<-data.frame(
      date = c(rep("2025-02-01", 13), rep("2025-02-02", 13),rep("2025-02-03", 13)),
      hour = rep(seq(6, 18, 1),3),
      obs = runif(13*3, min=1, max=50)
    )
    
    exp |>
      mutate(
        date.hour = factor(paste0(date, " ", hour, " hour"), levels=unique(paste0(date, " ", hour, " hour")), ordered=TRUE) 
      ) |>
      ggplot(aes(x=date.hour, y=obs, group=1)) +
      geom_line() + 
      theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
    

    这将生成以下图表:

    date+hour in x-axis

    然而,我想知道的是,是否有可能将日期跨越几个小时,创建一个看起来像这样的图表:

    date spanned for hours in x-axis

    1 回复  |  直到 4 月前
        1
  •  1
  •   stefan    4 月前

    使用最近发布的 legendry 使用该软件包,您可以轻松实现所需的结果 guide_axis_nested 像这样,即映射交互 date hour x ,设置分隔符以使用分隔符分隔变量 key_range_auto 并使用以下命令为每个级别的轴标签设置样式 levels_text= 预计a list 属于 element_text 元素。

    library(ggplot2)
    library(legendry)
    
    exp |>
      ggplot(
        aes(
          x = interaction(hour, date),
          y = obs, group = 1
        )
      ) +
      geom_line() +
      guides(x = guide_axis_nested(
        key = key_range_auto(sep = "\\."),
        levels_text = list(
          element_text(angle = 90, vjust = 0.5, hjust = 1),
          element_text(angle = 0, hjust = .5)
        )
      ))
    

    enter image description here