ggplotly 因 geom_vline() 和 xintercept 日期值而失败

ggplotly fails with geom_vline() with xintercept Date value

尝试使用 ggplotly 绘制时间序列数据图,并用一条垂直线表示感兴趣的日期。

调用失败,Ops.Date(z[[xy]], 86400000) 中出现错误:* 未为 "Date" 个对象 定义。我尝试使用最新的 CRAN 和 ggplot2 的开发版本(根据 plotly 推荐)均未成功。其他 SO 问题(例如,ggplotly and geom_bar when using dates - latest version of plotly (4.7.0))没有解决我的问题。

如下图对象 p 所示 - ggplotggplotly 均按预期工作。但是,当 geom_vline() 添加到 p2 中的绘图时,它只能在 ggplot 中正常工作,调用 ggplotly(p2) 时失败。

library(plotly)
library(ggplot2) 
library(magrittr)

set.seed(1)
df <- data.frame(date = seq(from = lubridate::ymd("2019-01-01"), by = 1, length.out = 10),
                 y = rnorm(10))

p <- df %>% 
  ggplot(aes(x = date, y = y)) + 
  geom_line() 
p ## plots as expected
ggplotly(p) ## plots as expected

p2 <- p + geom_vline(xintercept = lubridate::ymd("2019-01-08"), linetype = "dashed")
p2 ## plots as expected
ggplotly(p2) ##fails

我刚刚使用@Axeman 的建议解决了这个问题。在你的情况下,你可以只替换日期:

 lubridate::ymd("2019-01-01")

变成

 as.numeric(lubridate::ymd("2019-01-01"))

不漂亮,但很管用。

供将来参考:

通过日期(或 POSIX*)到数字转换创建的垂直线的 pop-up window 相当空白。这对于通常无法直接读取准确时间的 POSIX* 应用程序尤其有效。

如果您需要更重要的 pop-up 内容,text 审美的定义可能会有所帮助(忽略 'unknown aesthetics' 警告,因为它似乎不适用) .然后,只需通过 tooltip 参数指定您希望在鼠标悬停期间看到的内容,即。排除 xintercept,一切就绪。

p2 = p + 
  geom_vline(
    aes(
      xintercept = as.numeric(lubridate::ymd("2019-01-08"))
      , text = "date: 2019-01-08"
    )
    , linetype = "dashed"
  )

ggplotly(p2, tooltip = c("x", "y", "text"))