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

请求生成2016年前后分色的R语言时间范围图(附示例与数据集)

时间范围分段着色图表实现方案

问题描述

需要生成一张时间范围图,使用以下玩具数据集:

Group1  N       Year
A      10(10)   1999-2001
B      83(56)   2001-2004
C      100(94)  2006-2007
D      53(51)   2009-2011
E      20(19)   2012-2012
F      142(141) 2015-2016
G      34(32)   2015-2017
H      45(45)   2014-2018
I      21(19)   2016-2017
J      82(53)   2017-2019
K      12(12)   2021-2021

需求细节:

  • 2016年之前的时间段用蓝色展示,2016年之后的用红色展示
  • 跨2016年的组(G、H),2016年前部分用蓝色,之后部分用红色
  • 每个时间段上方标注对应N列的数值
  • 曾尝试用geom_errorbar实现但效果不佳,需要可行方案

解决方案(R + ggplot2)

步骤1:数据预处理

先拆分Year列为起始和结束年份,同时拆分跨2016年的分组为两段数据:

library(tidyverse)

# 加载数据集
df <- tribble(
  ~Group1, ~N, ~Year,
  "A", "10(10)", "1999-2001",
  "B", "83(56)", "2001-2004",
  "C", "100(94)", "2006-2007",
  "D", "53(51)", "2009-2011",
  "E", "20(19)", "2012-2012",
  "F", "142(141)", "2015-2016",
  "G", "34(32)", "2015-2017",
  "H", "45(45)", "2014-2018",
  "I", "21(19)", "2016-2017",
  "J", "82(53)", "2017-2019",
  "K", "12(12)", "2021-2021"
)

# 拆分年份并处理跨段分组
df_processed <- df %>%
  separate(Year, into = c("start_year", "end_year"), sep = "-", convert = TRUE) %>%
  rowwise() %>%
  mutate(
    segments = list(
      if (start_year <= 2016 && end_year > 2016) {
        tibble(
          seg_start = c(start_year, 2016),
          seg_end = c(2016, end_year),
          color = c("blue", "red")
        )
      } else if (end_year <= 2016) {
        tibble(seg_start = start_year, seg_end = end_year, color = "blue")
      } else {
        tibble(seg_start = start_year, seg_end = end_year, color = "red")
      }
    )
  ) %>%
  unnest(segments) %>%
  ungroup()

步骤2:绘制图表

用geom_segment实现分段着色的时间条,搭配geom_text添加数值标注:

ggplot(df_processed, aes(y = Group1)) +
  # 绘制分段时间条
  geom_segment(
    aes(x = seg_start, xend = seg_end, yend = Group1, color = color),
    size = 5,
    lineend = "square"
  ) +
  # 添加N值标注
  geom_text(
    data = df,
    aes(x = (start_year + end_year)/2, label = N),
    y = as.numeric(factor(Group1)) + 0.2,
    size = 4
  ) +
  # 直接使用定义的颜色
  scale_color_identity() +
  # 坐标轴与主题设置
  labs(x = "年份", y = "分组") +
  theme_minimal() +
  theme(
    axis.text.y = element_text(size = 10),
    axis.title = element_text(size = 12)
  )

效果说明

  • 2016年及之前的时间段显示为蓝色,之后的显示为红色
  • 跨2016年的分组自动拆分为两段,分别对应不同颜色
  • 每个分组的时间条上方居中显示N值
  • 用geom_segment替代geom_errorbar,能更灵活处理分段着色需求

内容的提问来源于stack exchange,提问作者Ahir Bhairav Orai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 12:32:12