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

floor_date函数导致geom_rect()无法绘制的原因及两段ggplot2代码图表差异解析

问题原因分析:两段代码结果差异的核心

让我来帮你拆解这两段代码结果不同的关键原因~其实问题出在日期数据类型的差异以及对日期运算的不同处理上,咱们一步步理清楚:

1. 两段代码中day列的数据类型完全不同

  • 第一段代码里,floor_date(ymd_hms(...), unit="days")返回的是POSIXct类(带时间戳的日期时间对象,底层是以秒为单位存储的数值)。
  • 第二段代码里,ymd(...)返回的是Date类(仅包含日期的对象,底层是以天为单位存储的数值)。

2. 日期运算的行为差异导致矩形“消失”

geom_rect需要xmin和xmax有明显的间隔才能画出可见的矩形:

  • 对于Date类型的day,day+1的含义是增加1天,所以xmin=day(比如2021-12-20),xmax=day+1(2021-12-21),两者间隔1天,矩形能正常渲染出来。
  • 对于POSIXct类型的day,day+1的含义是增加1秒(因为POSIXct的存储单位是秒),所以xmin和xmax的间隔仅1秒,在图表上完全看不到矩形,看起来就只剩线条了。

3. 修正第一段代码的方法

要让第一段代码的矩形正常显示,得用lubridate提供的days()函数明确指定增加1天,而不是直接用+1:

library("ggplot2")
library("lubridate")
a <- data.frame(
  day=c(floor_date(ymd_hms("2021/12/20 10:00:00"), unit="days"), floor_date(ymd_hms("2021/12/21 11:11:11"), unit="days")),
  start=c(10,20),
  end=c(50,60)
)
ggplot(a) + 
  geom_rect(aes(xmin=day,xmax=day + days(1),ymin=start, ymax=end)) + 
  geom_line(aes(x=day,y=start))

这样xmax就会是day对应的日期时间加1天,矩形就能和第二段代码的效果完全一致了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 11:22:43