es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Formato de tiempo (horas) al trazar los efectos suavizados GAM con mgcViz.

Tengo un modelo GAM en el que la hora del día es uno de los valores predictores. La hora está en formato numérico, ya que según entiendo, mgcv::gam no acepta la clase POSIXct. El modelo funciona bien, pero me gustaría ver un gráfico donde el efecto suave tenga HH:MM en el eje X, en lugar del continuo Unix Epoch. Estoy utilizando mgcViz para graficar.

¿Cómo puedo obtener formatos de hora agradables (HH/HH:MM) en las etiquetas del eje X?

Ejemplo reproducible:

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)

# Época en el eje X, debería ser HH:MM
print(plot_mod)
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para cambiar las etiquetas del eje X de la época UNIX al formato HH:MM, podemos utilizar la función scale_x_datetime() del paquete ggplot2. Así es como podemos modificar el código existente para lograrlo:

    require(mgcv)
    require(mgcViz)
    require(ggplot2) # añadir el paquete ggplot2
    
    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) +
      scale_x_datetime(labels = date_format("%H:%M")) # establecer las etiquetas del eje a formato HH:MM
    
    print(plot_mod)
    

    La función scale_x_datetime() toma un argumento labels, que especifica el formato de las etiquetas en el eje X. Utilizamos la función date_format() para especificar que queremos solo la componente de tiempo en el formato HH:MM.

    Con esta modificación, el gráfico ahora debería mostrar la hora del día en el formato deseado en el eje X.

Comments are closed.