ggplot绘图需求:显示全部预设项目阶段并展示项目进度
解决方案
步骤1:数据预处理
首先需要把原始数据展开,生成每个项目的所有已完成阶段和当前阶段的记录,同时确保阶段顺序包含所有需要展示的阶段(包括phase6)。
步骤2:绘图实现
这里提供两种可视化方式,你可以根据需求选择:
方式1:瓷砖图(清晰展示每个阶段状态)
用不同颜色的方块区分已完成阶段和当前阶段,所有指定阶段都会显示在x轴上,哪怕没有对应数据。
library(tidyverse) # 定义所有需要展示的阶段,包含phase6 phases <- c("phase1", "phase2", "phase3", "phase4", "phase5", "phase6") # 原始数据 df1 = data.frame(a = c("Project1", "Project2", "Project3","Project4"), b = c(2, 4, 2, 5)) # 数据预处理:生成每个项目的阶段记录并标记状态 df_processed <- df1 %>% mutate(current_phase = phases[b]) %>% rowwise() %>% mutate(phase = list(phases[1:b])) %>% unnest(phase) %>% mutate(status = ifelse(phase == current_phase, "当前阶段", "已完成")) %>% ungroup() %>% mutate(phase = factor(phase, levels = phases)) # 绘制瓷砖图 ggplot(df_processed, aes(x = phase, y = a, fill = status)) + geom_tile(color = "white", size = 1) + scale_fill_manual(values = c("已完成" = "#90EE90", "当前阶段" = "#FFB6C1")) + scale_x_discrete(drop = FALSE) + # 强制显示所有阶段,包括无数据的phase6 labs(x = "项目阶段", y = "项目名称", fill = "状态") + theme_minimal() + theme(axis.text.x = element_text(angle = 45, hjust = 1))
方式2:线条+点图(突出阶段推进路径)
用线条展示已完成的阶段路径,用点标记当前阶段,同样保留所有指定阶段的x轴。
ggplot() + # 绘制已完成阶段的线条 geom_segment(data = df1 %>% mutate(end_phase = phases[b-1]), aes(x = phases[1], xend = end_phase, y = a, yend = a), color = "#90EE90", size = 2) + # 绘制当前阶段的标记点 geom_point(data = df1 %>% mutate(current_phase = phases[b]), aes(x = current_phase, y = a), color = "#FFB6C1", size = 5) + scale_x_discrete(limits = phases, drop = FALSE) + labs(x = "项目阶段", y = "项目名称") + theme_minimal()
关键说明
scale_x_discrete(drop = FALSE)是核心设置,确保x轴显示所有定义的阶段,哪怕没有对应数据(比如phase6)。- 通过
factor(phase, levels = phases)固定阶段的显示顺序,避免ggplot自动打乱排序。 - 颜色可按需自定义,替换代码中的颜色值即可。
内容的提问来源于stack exchange,提问作者Fred
相关产品推荐
相关产品推荐

