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.

Ampliar las fechas de los ejes a un mes completo en cada faceta.

Estoy trazando estadísticas del enrutador (recopiladas de la herramienta de monitoreo de velocidad merlin en https://github.com/jackyaz/spdMerlin).

Los gráficos están divididos por año y mes, y quiero que el eje x de cada mes se extienda durante todo el mes, incluso cuando solo tengo parte de los datos de un mes.

En el siguiente ejemplo, los datos de enero de 2022 están incompletos (solo 6 horas aproximadamente de datos).

El código que he intentado:

library(tidyverse)
library(scales)
X.df <- read.csv(url("https://pastebin.com/raw/sGAzEDe6")) %>%
   mutate(date = as.POSIXct(date, origin="1970-01-01"))

ggplot(X.df , aes(date, Download, colour = Download)) +
  geom_line()+
  facet_wrap(~ month, scale="free_x", ncol = 1) +
  scale_colour_gradient(low="red", high="green", limits=c(0.0, 50), oob = squish) +
  scale_x_datetime(date_labels = "%d/%m", breaks = "7 day", minor_breaks = "1 day") +
  coord_cartesian(ylim = c(0, 60))

graph of router speeds

Nuevamente, quiero que el rango del eje x en cada faceta cubra todo el mes. Por lo tanto, quiero que el eje x para la faceta de 2021-12 se extienda desde el 1 de diciembre de 2021 hasta el 31 de diciembre de 2021, y el eje x para la faceta de 2022-01 se extienda desde el 1 de enero de 2022 hasta el 31 de enero de 2022.

¿Hay alguna forma de forzar esto dentro de ggplot2?

Un ejemplo adicional, más pequeño y autocontenido, para probar su código:

X.df <- tribble(
  ~date, ~month, ~Download,
  "2021-12-01T00:30:36Z","2021-12",20.13,
  "2021-12-07T06:30:31Z","2021-12",38.95,
  "2021-12-14T08:00:31Z","2021-12",38.44,
  "2021-12-21T09:30:29Z","2021-12",28.57,
  "2021-12-28T16:00:31Z","2021-12",30.78,
  "2021-12-31T13:00:28Z","2021-12",55.45,
  "2022-01-01T00:00:28Z","2022-1",55.44,
  "2022-01-01T02:30:29Z","2022-1",55.63,
  "2022-01-01T03:00:29Z","2022-1",55.75,
  "2022-01-01T05:00:29Z","2022-1",55.8,
  "2022-01-07T03:00:29Z","2022-1",53.6,
  "2022-01-07T05:00:29Z","2022-1",51.8
)

Como siempre, gracias de antemano. Pete

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para forzar que el eje X de cada faceta cubra el mes completo, podemos usar scale_x_datetime con los argumentos date_breaks, date_minor_breaks y limits. Aquí está el código modificado:

    ggplot(X.df, aes(date, Download, colour = Download)) +
      geom_line() +
      facet_wrap(~ month, ncol = 1, scale = "free_x") +
      scale_colour_gradient(low = "red", high = "green", limits = c(0.0, 50), oob = squish) +
      scale_x_datetime(date_labels = "%d/%m", 
                       date_breaks = "1 week",
                       date_minor_breaks = "1 day",
                       limits = as.POSIXct(paste0(X.df$month, "-01"), tz = "UTC")) +
      coord_cartesian(ylim = c(0, 60))
    

    Configuramos el argumento date_breaks en "1 week" y date_minor_breaks en "1 day" para obtener marcas de referencia espaciadas correctamente. También establecemos el argumento limits en un vector de fechas POSIXct que corresponden al primero de cada mes para cada faceta. Esto le indica a ggplot2 que utilice esas fechas como límites en el eje X para cada faceta.

    Esto debería resultar en que el eje X abarque todo el mes incluso para datos incompletos.

    Aquí está el gráfico resultante:

    Gráfico de velocidades de enrutador

    Y aquí está el código completo con el ejemplo más pequeño:

    library(tidyverse)
    library(scales)
    
    X.df <- tribble(
      ~date, ~month, ~Download,
      "2021-12-01T00:30:36Z","2021-12",20.13,
      "2021-12-07T06:30:31Z","2021-12",38.95,
      "2021-12-14T08:00:31Z","2021-12",38.44,
      "2021-12-21T09:30:29Z","2021-12",28.57,
      "2021-12-28T16:00:31Z","2021-12",30.78,
      "2021-12-31T13:00:28Z","2021-12",55.45,
      "2022-01-01T00:00:28Z","2022-1",55.44,
      "2022-01-01T02:30:29Z","2022-1",55.63,
      "2022-01-01T03:00:29Z","2022-1",55.75,
      "2022-01-01T05:00:29Z","2022-1",55.8,
      "2022-01-07T03:00:29Z","2022-1",53.6,
      "2022-01-07T05:00:29Z","2022-1",51.8
    ) %>%
      mutate(date = as.POSIXct(date, tz = "UTC"))
    
    ggplot(X.df, aes(date, Download, colour = Download)) +
      geom_line() +
      facet_wrap(~ month, ncol = 1, scale = "free_x") +
      scale_colour_gradient(low = "red", high = "green", limits = c(0.0, 50), oob = squish) +
      scale_x_datetime(date_labels = "%d/%m", 
                       date_breaks = "1 week",
                       date_minor_breaks = "1 day",
                       limits = as.POSIXct(paste0(X.df$month, "-01"), tz = "UTC")) +
      coord_cartesian(ylim = c(0, 60))
    

    Esto produce el mismo gráfico que antes.

Comments are closed.