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.

Error de figura de serie de tiempo de ggplot: Entrada no válida: time_trans funciona solo con objetos de clase POSIXct PERO los datos están en POSIXct.

Mi conjunto de datos es un dataframe con la temperatura máxima diaria del agua durante los últimos 4 veranos.

     X sitio     FechaHora                valor Mes   Año   Día  
   <int> <fct>     <dttm>              <dbl> <int> <fct> <chr>
 1  6775 RAYNER_UP 2018-07-09 19:00:00  19.8     7 2018  07/10
 2  6776 RAYNER_UP 2018-07-10 19:00:00  21.2     7 2018  07/11
 3  6777 RAYNER_UP 2018-07-11 19:00:00  20.4     7 2018  07/12
 4  6778 RAYNER_UP 2018-07-12 19:00:00  20.1     7 2018  07/13
 5  6779 RAYNER_UP 2018-07-13 19:00:00  17.3     7 2018  07/14
 6  6780 RAYNER_UP 2018-07-14 19:00:00  19.5     7 2018  07/15
 7  6781 RAYNER_UP 2018-07-15 19:00:00  21.2     7 2018  07/16
 8  6782 RAYNER_UP 2018-07-16 19:00:00  21.0     7 2018  07/17
 9  6783 RAYNER_UP 2018-07-17 19:00:00  19.8     7 2018  07/18
10  6784 RAYNER_UP 2018-07-18 19:00:00  16.8     7 2018  07/19

Mi objetivo es hacer un gráfico de líneas con una línea diferente para cada año. Hasta ahora, con mucha ayuda de Internet, he hecho una línea para cada año PERO la escala está terriblemente apretada ejemplo.

Me gustaría reescalar el eje x en mi series de tiempo para mostrar los días del mes.

Hasta ahora, he intentado usar scale_x_datetime y scale_x_date en ggplot, pero no he tenido éxito. Siempre recibo el error: Entrada inválida: time_trans solo funciona con objetos de clase POSIXct, aunque la columna de fecha está en formato POSIXct.

Aquí hay un ejemplo de mi código que está dando el problema:

test1 = ggplot() +
  geom_line(data = Rayner_up_summer, aes(x=strftime(DateTime,format="%m/%d"),
                                        y=value, 
                                        group = Year,
                                        color=strftime(DateTime,format="%Y"))) +
  scale_color_discrete(name="Año") +
  labs(x="fecha")

¿Alguien sabe por qué no puedo usar scale_x_datetime a pesar de que mi eje x (DateTime) está en formato de fecha y hora POSIXct? Agradecería cualquier consejo que puedan tener.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Es probable que el problema esté en la conversión de la columna DateTime a una cadena de caracteres utilizando la función strftime(). Esto podría hacer que ggplot lea el eje x como un vector de caracteres en lugar de un objeto de fecha y hora.

    En lugar de convertir la columna DateTime a una cadena de caracteres, prueba a usarla directamente en aes() como un objeto de fecha y hora y luego utiliza scale_x_datetime() para personalizar las etiquetas del eje x.

    Aquí tienes un ejemplo de código:

    # Convertir las columnas Mes y Día al formato de fecha
    Rayner_up_summer$Date <- as.Date(paste(Rayner_up_summer$Year, Rayner_up_summer$Month, Rayner_up_summer$Day, sep = "-"), format="%Y-%m-%d")
    
    # Crear una columna de año con el año de la columna DateTime
    Rayner_up_summer$Year <- as.factor(format(Rayner_up_summer$DateTime, "%Y"))
    
    # Graficar el gráfico con el eje de fecha y hora usando scale_x_datetime
    ggplot(Rayner_up_summer, aes(x=DateTime, y=value, group=Year, color=Year)) + 
      geom_line() +
      scale_x_datetime(date_breaks = "1 day", date_labels="%d/%m") +
      labs(x = "Fecha", y = "Temperatura Máxima Diaria")
    

    En el código anterior, creamos una nueva columna llamada “Date” que agrega información de las columnas Mes, Día y Año para crear un objeto de fecha. Luego, utilizamos esta columna para crear un gráfico de líneas con ggplot, utilizando directamente la columna DateTime como eje x y utilizando scale_x_datetime() para personalizar los intervalos y etiquetas del eje.

    Esto debería resultar en un gráfico de líneas con líneas separadas para cada año y un eje x de fecha y hora con intervalos diarios etiquetados como día/mes.

Comments are closed.