r - geom_col con posición = "esquivar" y fecha en el eje x (múltiples valores)

CorePress2024-01-25  13

Esta pregunta ya tiene respuesta aquí: ¿Cómo hacer que position_dodge y scale_x_date funcionen juntos?

(1 respuesta)

Cerrado

hace 2 años

.

Tengo la siguiente estructura de datos "x":

# A tibble: 18 x 4
   mm         mm_fct     Legenda waarde
   <date>     <fct>      <chr>    <dbl>
 1 2020-07-01 2020-07-01 Gas      0.906
 2 2020-07-01 2020-07-01 Temp    17.3  
 3 2020-08-01 2020-08-01 Gas      0.935

Esto está muy bien trazado por (el eje x necesita factores (!)):

 ggplot(x, aes(mm_fct, waarde, fill = Legenda)) +
    geom_col(position = position_dodge2())

Me gusta tener una fecha en el eje x, así que agréguela a scale_x_date() peroes obtener un error:

  ggplot(x, aes(mm_fct, waarde, fill = Legenda)) +
    geom_col(position = position_dodge2()) +
    scale_x_date(x$mm)

Error: Entrada no válida: date_trans funciona solo con objetos de clase Fecha

Lo que sea que ingrese como argumentos en scale_x_date().

¡Por favor ayuda!

stackoverflow.com/questions/38839923/… y stackoverflow.com/questions/45485181/…

-tjebo

28 de marzo de 2021 a las 11:54



------------------------------------

Editar: después del comentario de tjebo, donde señala correctamente que esta respuesta es casi la misma que la de van Nijnatten. La única diferencia que puedo ver es el uso de la función as_date frente a la función ymd de lubridate. ¡¡¡Votos a favor de van Nijnatten!!! Por favor, vea mi comentario sobre el comentario de tjebo.

Para manejar una situación "cuasi" series de tiempo puede utilizar el paquete lubridate con la función ymd. Entonces su eje x puede manejarse como una serie de tiempo. Ahora puedes usar scale_x_date().

library(tidyverse)
library(lubridate)

x <- x %>% 
  mutate(mm = ymd(mm))
         
ggplot(x, aes(mm, waarde, fill = Legenda)) +
  geom_col(position = position_dodge2())

datos:

# code from van Nijnatten
x <- tibble::tribble(
  ~mm,          ~mm_fct,      ~Legenda, ~waarde,
  "2020-07-01", "2020-07-01", "Gas",    0.906,
  "2020-07-01", "2020-07-01", "Temp",   17.3,
  "2020-08-01", "2020-08-01", "Gas",    0.935
) 

6

Es posible que me haya perdido algo esencial aquí, pero ¿en qué se diferencia esto de esta respuesta? stackoverflow.com/a/66840864/7941188

-tjebo

28 de marzo de 2021 a las 11:52

1

Tienes razón. Me perdí la biblioteca (lubridar) al principio y concluí que la respuesta es sin lubricar. Pero en la respuesta de van Nijnatten hay lubricante en medio del código. La función ymd que analiza fechas con componentes de año, mes y día aún podría resultar útil. De todos modos tienes razón, la única diferencia es el uso de la función as_dateFunción ion versus ymd del lubricado. Por favor vea mi edición.

- TarJae

28/03/2021 a las 12:10

2

@tjebo, no hay diferencia. @TarJae, lo único que señalé es que no se debe usar un objeto de carácter si quieres usarlo como fecha. El código de libridate existe sólo para replicar los datos; no es la solución. La solución es la primera línea de la respuesta y el último bit del código. ¡Salud!

- van Nijnatten

28/03/2021 a las 12:35

Gracias por los comentarios @ van Nijnatten.

- TarJae

28/03/2021 a las 13:01

¡Muchas gracias, funcionó según la respuesta! ¿Cómo puedo mostrar ahora valores para cada barra? Entonces muestra 0,906, 17,3, 0,935 en cada barra. Intenté geom_text() pero como esto usa la fecha como coordenada X, todos los valores están uno encima del otro donde quiero estar en la barra.

- Suerte

28/03/2021 a las 14:34



------------------------------------

¿Por qué no utilizas mm como variable para el eje x? En ese caso, tampoco necesitas ggplot2::scale_x_date().

library(tidyverse)
library(lubridate)

x <- tibble::tribble(
    ~mm,          ~mm_fct,      ~Legenda, ~waarde,
    "2020-07-01", "2020-07-01", "Gas",    0.906,
    "2020-07-01", "2020-07-01", "Temp",   17.3,
    "2020-08-01", "2020-08-01", "Gas",    0.935
  ) %>%
  dplyr::mutate(
    mm = lubridate::as_date(mm),
    mm_fct = as.factor(mm_fct)
  )


ggplot2::ggplot(
    data = x,
    mapping = ggplot2::aes(
      x = mm,
      y = waarde,
      fill = Legenda
    )
  ) +
  ggplot2::geom_col(
    position = position_dodge2()
  )

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare