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
所示 - ggplot
和 ggplotly
均按预期工作。但是,当 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"))
尝试使用 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
所示 - ggplot
和 ggplotly
均按预期工作。但是,当 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"))