如何用R创建带计数的多类型跨时段甘特式图表?
用R实现基于Type+时段组合的分组甘特图(timevis方案)
1. 数据导入与分组计数预处理
先导入CSV数据,把宽格式的时段列转成长格式,筛选出有效记录(数值非0),再按Type+时段组合统计数量:
# 加载依赖包 library(dplyr) library(tidyr) library(timevis) # 替换为你的CSV文件路径 df <- read.csv("your_data.csv", stringsAsFactors = FALSE) # 宽格式转长格式,只保留存在的时段记录 long_df <- df %>% pivot_longer(cols = starts_with("Period"), names_to = "Period", values_to = "Exists") %>% filter(Exists != 0) %>% select(-Exists) # 按Type+Period分组统计计数 grouped_df <- long_df %>% group_by(Type, Period) %>% summarize(Count = n(), .groups = "drop")
2. 构建timevis兼容的数据结构
timevis需要id、content、start、end列定义甘特图条目。按实际比例设置时段长度,计算每个条目的时间区间:
# 替换为各时段的真实长度数值,确保比例符合需求 period_lengths <- c(Period1 = 2, Period2 = 5, Period3 = 3, Period4 = 4, Period5 = 6, Period6 = 2, Period7 = 3) # 计算每个时段的起始时间(以0为起点累加长度) period_starts <- c(0, cumsum(period_lengths)[-length(period_lengths)]) names(period_starts) <- names(period_lengths) # 生成timevis所需的数据集 gantt_data <- grouped_df %>% mutate( id = row_number(), # 内容栏显示分组信息与计数 content = paste0(Type, " - ", Period, " (", Count, "条)"), start = period_starts[Period], end = period_starts[Period] + period_lengths[Period] )
3. 自定义样式:Type区分颜色,时段区分深浅
通过style列给不同Type分配专属颜色,用透明度区分时段深浅:
# 给6种Type分配对应颜色,可自行调整 type_colors <- c("A" = "#FF6B6B", "B" = "#4ECDC4", "C" = "#45B7D1", "D" = "#96CEB4", "E" = "#FFEAA7", "F" = "#DDA0DD") # 给各时段设置透明度,数值越小颜色越深 period_opacity <- c(Period1 = 1, Period2 = 0.8, Period3 = 0.6, Period4 = 0.9, Period5 = 0.7, Period6 = 0.5, Period7 = 0.85) # 为每个条目添加样式 gantt_data <- gantt_data %>% mutate( style = paste0("background-color: ", type_colors[Type], "; opacity: ", period_opacity[Period], ";") ) # 生成甘特图 timevis( data = gantt_data, options = list( axis = list(type = "custom", tick = list(format = function(x) x)), # 显示时长数值而非日期 orientation = "top" # 可选调整时间轴位置 ) )
补充说明
- 若不清楚时段真实长度,可直接用列顺序作为等长比例,或根据数据中时段的平均出现时长计算比例
- 如需单独展示计数,可给
gantt_data添加tooltip列,或用addCustomTime在侧边标注 - 调整行顺序可在
gantt_data中对Type或Period做排序处理
内容的提问来源于stack exchange,提问作者RobinLew
相关产品推荐
相关产品推荐

