Как использовать scale_y_datetime с данными difftime?

#r #datetime #ggplot2 #axis-labels #posixct

#r #дата-время #ggplot2 #ось-метки #posixct

Вопрос:

Есть ли способ использовать scale_y_datetime() в горизонтально уложенном столбчатом графике кумулятивные длительности?

У меня есть данные, структурированные следующим образом:

 x1 = as.POSIXct("2020-08-01 12:00")
x2 = as.POSIXct("2020-08-01 16:00")
df = tibble::tibble(
  x = seq(dt_start, dt_end, length.out = 10)   rnorm(10, 0, sd = 300), 
  y = difftime(x, lag(x, 1))
) %>% 
  filter(!is.na(y))  # First lag(x, 1) is NA.
  

Итак df ,:

 # A tibble: 9 x 2
  x                   y            
  <dttm>              <drtn>       
1 2020-08-01 11:42:19 31.60503 mins
2 2020-08-01 12:09:29 27.17099 mins
3 2020-08-01 12:50:43 41.23540 mins
4 2020-08-01 13:10:45 20.03007 mins
5 2020-08-01 13:42:00 31.26120 mins
6 2020-08-01 14:24:41 42.67504 mins
7 2020-08-01 14:44:43 20.02577 mins
8 2020-08-01 15:15:10 30.45446 mins
9 2020-08-01 15:40:41 25.51719 mins
  

Я строю это, используя горизонтально расположенную линейчатую диаграмму:

 gg = ggplot(df, aes(x = 1, y = y, fill = as.factor(x)))   
  geom_bar(stat = "identity")   
  coord_flip()
  

введите описание изображения здесь

Теперь я хочу показать время в df$x по оси x. Однако это не удается:

 gg   scale_y_datetime()
  

с ошибкой

 Error: Invalid input: time_trans works with objects of class POSIXct only
  

вероятно, потому, что df$x это difftime объект. Я пробовал различные решения, но получил только очень обходное решение для работы:

 x_pos = seq(min(df$x), max(df$x), length.out = 10)
x_label = format(x_pos, "%H:%M")
gg   scale_y_continuous(breaks = as.numeric(x_pos - min(df$x)) / 60, labels = x_label)
  

введите описание изображения здесь

Для этого требуется знать масштаб вашего диапазона дат (здесь «минуты» -> / 60 ), и вы не получите хорошего округления временных меток. Есть ли способ использовать scale_y_datetime() ?

Комментарии:

1. Нет x1 , x2 определено?

2. @RonakShah Спасибо за уловку. Теперь это воспроизводимо.

Ответ №1:

Я думаю, что я не понимаю, почему вы используете разницу во времени.. Но я не понял этого из вашего вопроса..

Вы не можете пойти с этим?

 library(dplyr)
library(ggplot2)

# reproducible example
x1 <- Sys.time()
x2 <- Sys.time()   1000
df <- tibble::tibble(x = seq(x1, x2, length.out = 10)   rnorm(10, 0, sd = 300))
df <- df %>% mutate(x1 = lag(x)) %>% filter(!is.na(x1))


# solution ?
ggplot(df)  
    geom_rect(aes(xmin = x1, xmax = x, ymin = 0, ymax = 1, fill = factor(x)), show.legend = FALSE)
  

введите описание изображения здесь