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

使用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()

错误原因解释

  1. 你之前用gather把起始、结束日期拆成两行数据,geom_col会把每个日期值当成从x轴原点开始的条形长度,而非两个日期之间的区间,完全不符合需求。
  2. 将日期转成整数的操作毫无必要,ggplot2原生支持POSIXct类型的日期作为x轴变量,直接使用即可。

内容的提问来源于stack exchange,提问作者Corentin Wicht

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 00:54:55