【问题标题】:Why does floor_date prevent geom_rect() to draw?为什么 floor_date 会阻止 geom_rect() 绘制?
【发布时间】:2021-09-09 08:57:36
【问题描述】:

我想知道为什么这两个代码sn-ps 不会产生相同的结果。为什么这两个图表不同?

library("ggplot2")
library("lubridate")

# This will draw a line only
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+1,ymin=start, ymax=end)) + geom_line(aes(x=day,y=start))

# This will draw a line *and* a rectangle
a <- data.frame(
    day=c(ymd("2021/12/20"),
          ymd("2021/12/21")),
    start=c(10,20),
    end=c(50,60))
ggplot(a) + geom_rect(aes(xmin=day,xmax=day+1,ymin=start, ymax=end)) + geom_line(aes(x=day,y=start))

编辑:将 day+0.5 替换为 day+1 以避免误导舍入问题。

【问题讨论】:

    标签: r dataframe lubridate


    【解决方案1】:

    第一个示例的日期类别为 POSIXct,第二个示例的日期类别为 Date。 + 运算符的作用不同:

    library("lubridate")
    #> 
    #> Attaching package: 'lubridate'
    #> The following objects are masked from 'package:base':
    #> 
    #>     date, intersect, setdiff, union
    
    floor_date(ymd_hms("2021/12/20 10:00:00"), unit="days") + 0.5
    #> [1] "2021-12-20 00:00:00 UTC"
    ymd("2021/12/21") + 0.5
    #> [1] "2021-12-21"
    

    reprex package (v2.0.1) 于 2021-09-09 创建

    第一个示例将导致宽度为 0 的条形。

    【讨论】:

    • 在给定代码中将 0.5 更改为 1 时,它仍然给出描述的问题(我测试过)
    • +1 在 POSIXct 类的对象上会增加一秒的时间,但是你的 x 刻度的宽度是 1 天,所以仍然几乎是 0
    • 是的,我想通了,边走边想你的答案 :-) 你绝对是对的(我测试过,将 3600*24 添加到 day 使其工作)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    • 2011-10-16
    • 2011-05-20
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多