如何用ggplot绘制多时间区间甘特图?对比计划与实际工期
解决ggplot绘制项目计划/实际甘特图的问题
你的代码存在几个关键问题导致无法正常运行,下面是修正后的完整代码及问题说明:
问题点梳理
- 管道符语法错误:
project_data %>缺少末尾的%,正确写法是project_data %>% - 日期未转换为时间类型:当前日期是字符格式,ggplot无法识别为时间轴,无法正确排序和展示
- 数据结构不匹配绘图需求:宽格式数据难以实现y轴重复显示项目名称并对应不同时间组,需要转为长格式
修正后的代码
library(tidyverse) # 构建数据并转换日期格式 project_data <- tibble( Project_Name = c("Warehouse"), Proposed_Start = mdy("05-01-2022"), # 用mdy()识别月-日-年格式的日期 Proposed_Finish = mdy("12-01-2022"), Actual_Start = mdy("07-01-2022"), Actual_Finish = mdy("12-31-2022") ) # 将宽格式数据转为长格式,适配分组绘图需求 project_long <- project_data %>% pivot_longer( cols = -Project_Name, names_to = c("Type", ".value"), names_pattern = "(.*)_(Start|Finish)" ) # 绘制甘特图 ggplot(project_long, aes(x = Start, xend = Finish, y = Project_Name, yend = Project_Name, color = Type)) + geom_segment(size = 8) + scale_color_manual(values = c("Actual" = "red", "Proposed" = "green")) + labs(title = "项目计划与实际日期对比", x = "起止日期", y = "项目名称") + theme_minimal()
代码说明
- 用
mdy()函数(tidyverse内置的lubridate包提供)将字符日期转为标准Date类型,确保x轴为正确的时间轴 pivot_longer()将宽格式数据重构为长格式,生成Type列区分计划/实际数据,同时保留统一的Start和Finish列,让ggplot自动分组,实现y轴重复显示"Warehouse"并对应两组时间线段scale_color_manual()自定义颜色,同时自动生成清晰的图例,比直接在aes中写颜色字符串更规范
内容的提问来源于stack exchange,提问作者Harry Kalsted
相关产品推荐
相关产品推荐

