使用ggplot2绘制日期范围条形图遇到问题求助
解决日期范围条形图绘制问题
你的核心问题在于:用gather转成long格式后用geom_col的思路不对——geom_col默认是从x轴起始点开始绘制长度为x值的条形,但你需要的是展示两个日期之间的区间长度,不需要把数据转成长格式,直接用宽格式结合geom_rect或geom_segment就能实现。
正确代码实现
下面用两种方式实现你要的效果,更贴近示例图的是geom_rect版本:
方式1:使用geom_rect(实心条形效果)
library(ggplot2) # 示例数据 DF <- data.frame(Name = as.factor(c("1.Project1", "2.Project2", "3.Project3", "4.Project4")), CreationTime = as.POSIXct(c("2019-12-10 13:22:20", "2019-12-17 12:25:48", "2020-01-02 13:02:57", "2020-01-14 08:37:10")), LastActivity = as.POSIXct(c("2019-12-17 10:42:17 ", "2020-01-02 13:27:10", "2021-02-11 11:32:45", "2023-05-03 07:41:38")), Status = as.factor(c("Prod", "Prod", "Dev", "Complete"))) ggplot(DF, aes(fill = Status)) + # 绘制矩形条形:x范围是起始到结束日期,y范围通过因子数值偏移控制条形高度 geom_rect(aes(xmin = CreationTime, xmax = LastActivity, ymin = as.numeric(Name) - 0.4, ymax = as.numeric(Name) + 0.4)) + # 将y轴刻度替换为项目名称 scale_y_continuous(breaks = 1:nrow(DF), labels = DF$Name) + # 设置x轴日期显示格式 scale_x_datetime(date_breaks = "3 months", labels = scales::label_date_short()) + labs(x = "时间", y = "项目", fill = "状态") + theme_minimal()
方式2:使用geom_segment(线条式区间效果)
如果不需要实心条形,用粗线条也能清晰展示区间:
library(ggplot2) ggplot(DF, aes(color = Status)) + geom_segment(aes(x = CreationTime, xend = LastActivity, y = Name, yend = Name), size = 8) + scale_x_datetime(date_breaks = "3 months", labels = scales::label_date_short()) + labs(x = "时间", y = "项目", color = "状态") + theme_minimal()
错误原因解释
- 你之前用
gather把起始、结束日期拆成两行数据,geom_col会把每个日期值当成从x轴原点开始的条形长度,而非两个日期之间的区间,完全不符合需求。 - 将日期转成整数的操作毫无必要,ggplot2原生支持
POSIXct类型的日期作为x轴变量,直接使用即可。
内容的提问来源于stack exchange,提问作者Corentin Wicht
相关产品推荐
相关产品推荐

