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()
)