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
相关产品推荐
相关产品推荐

