You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R中绘制跨年度采样时间区间并实现年份堆叠布局

采样部署时长图优化方案

问题核心

当前代码的两个关键问题:

  • 直接用原始日期映射X轴,导致跨年份的日期超出12个月范围,无法形成紧凑的12月X轴布局
  • 跨年部署(比如Deployment7跨2022和2023)无法在对应年份行分别显示完整区间

优化实现

1. 重构数据:简化结构+自动拆分跨年部署

不需要把每天展开成一行,只保留部署核心信息,同时自动拆分跨年度的部署段:

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

# 直接构建部署核心数据(无需展开到每日)
deployments_raw <- tibble(
  id = c("Deployment 3", "Deployment 7"),
  start = as.Date(c("2021-12-15", "2022-12-17")),
  end = as.Date(c("2021-12-31", "2023-01-31"))
)

# 自动处理跨年部署,拆分到对应年份
deployments <- deployments_raw %>%
  mutate(year_start = year(start)) %>%
  # 生成当前年份的部署段
  rowwise() %>%
  mutate(
    end_year = if_else(year(end) == year_start, end, ymd(paste0(year_start, "-12-31"))),
    # 标准化日期:映射到基准年(如2020),让X轴统一显示12个月
    start_norm = ymd(paste0("2020-", month(start), "-", day(start))),
    end_norm = ymd(paste0("2020-", month(end_year), "-", day(end_year)))
  ) %>%
  ungroup() %>%
  # 补充跨年的后半段部署
  bind_rows(
    deployments_raw %>%
      filter(year(end) != year(start)) %>%
      mutate(
        year_start = year(end),
        start = ymd(paste0(year(end), "-01-01")),
        start_norm = ymd("2020-01-01"),
        end_norm = ymd(paste0("2020-", month(end), "-", day(end)))
      )
  ) %>%
  select(id, year = year_start, start, end, start_norm, end_norm)

2. 绘制紧凑布局的时长图

用geom_rect替代geom_tile,更精准绘制时间区间,配合标准化日期实现12月X轴:

ggplot(deployments) +
  # 绘制部署区间,fill区分不同部署
  geom_rect(
    aes(
      xmin = start_norm, xmax = end_norm,
      ymin = as.numeric(as.factor(year)) - 0.3,
      ymax = as.numeric(as.factor(year)) + 0.3,
      fill = id
    ),
    color = "white", alpha = 0.8
  ) +
  # X轴设置:固定显示12个月份
  scale_x_date(
    breaks = seq(ymd("2020-01-01"), ymd("2020-12-01"), by = "month"),
    labels = month.abb,
    expand = c(0, 0)
  ) +
  # Y轴设置:显示年份
  scale_y_continuous(
    breaks = 1:length(unique(deployments$year)),
    labels = unique(deployments$year),
    expand = c(0, 0)
  ) +
  # 主题与标签优化
  labs(x = "月份", y = "年份", fill = "部署编号") +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    panel.grid.major.x = element_line(color = "#e0e0e0"),
    panel.grid.minor = element_blank()
  )

关键逻辑说明

  • 日期标准化:把所有日期替换为2020年的对应月日,既保留了原日期的月日精度,又让X轴自然呈现12个月的紧凑布局
  • 跨年拆分:自动将跨年度部署拆分为两段,分别对应起始年份和结束年份的行,确保区间显示准确
  • geom_rect优势:相比geom_tile,能更灵活地绘制任意起止的时间区间,避免width参数计算误差

内容的提问来源于stack exchange,提问作者Angaro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 20:03:19