使用 mgcViz 绘制 GAM 平滑效果时的时间(小时)格式

Time (hours) formatting when plotting GAM smooth effects with mgcViz

我有一个 GAM 模型,其中时间是预测变量值之一。时间是数字格式,因为据我所知,mgcv::gam 不接受 POSIXct class。该模型运行良好,但我希望看到平滑效果在 X 轴上具有 HH:MM 的图,而不是连续的 UNIX 纪元。我正在使用 mgcViz 进行绘图。

如何在 X 轴标签上获得漂亮的时间格式 (HH/HH:MM)?

可重现的例子:

require(mgcv)
require(mgcViz)

min_datetime <- as.POSIXct(strptime("2021-12-27 06:00:00", "%Y-%m-%d %H:%M:%S"))
max_datetime <- as.POSIXct(strptime("2021-12-27 18:00:00", "%Y-%m-%d %H:%M:%S"))

x <- runif(100)
y <- runif(100)
tod <- runif(100, min = as.numeric(min_datetime), max = as.numeric(max_datetime))

df <- data.frame(x, y, tod)

mod <- gam(y ~ x + tod, data = df)

viz_mod <- getViz(mod)

plot_mod <- plot(viz_mod, select = 2) +
  l_fitLine(linetype = 1)

# Epoch on X-axis, should be HH:MM
print(plot_mod)

由于 mgcVizggplot2 的包装器,您可以使用标准 ggplot2::scale_... 函数来操作您的标签、中断或您希望在图中显示的任何其他内容。这里我们可以使用 scale_x_continuous 将数字 x 轴转换回 POSIXct 然后根据需要格式化它。

plot_mod +
  scale_x_continuous(labels = ~ format(as.POSIXct(.x, origin = origin), "%H:%M"))