R, проблемы с отображением дат в Shiny и ggvis

Я немного новичок в Shiny и ggvis, и на самом деле у меня есть пара проблем. Сначала у меня есть данные в формате:

            Event.Hour Count    Group
1  2015-10-08 00:00:00  1476      All
2  2015-10-08 01:00:00 22186      All
3  2015-10-08 02:00:00  2958      All
4  2015-10-08 03:00:00  3484      All
5  2015-10-08 04:00:00  4159      All
6  2015-10-08 05:00:00  2960      All
7  2015-10-08 00:00:00   222 Business
8  2015-10-08 01:00:00    26 Business
9  2015-10-08 02:00:00   542 Business
10 2015-10-08 03:00:00    26 Business
11 2015-10-08 04:00:00  4760 Business
12 2015-10-08 05:00:00  4640 Business
13 2015-10-08 00:00:00  1704   System
14 2015-10-08 01:00:00   100   System
15 2015-10-08 02:00:00   122   System
16 2015-10-08 03:00:00    10   System
17 2015-10-08 04:00:00  3339   System
18 2015-10-08 05:00:00  5370   System

Даты были созданы с помощью функции dmy_hms lubridate:

> class(viz_set$Event.Hour)
[1] "POSIXct" "POSIXt" 

Код для воссоздания набора данных:

library(ggvis)
library(dplyr)
library(lubridate)

zz<- "Event.Hour Count    Group
1  2015-10-08-00:00:00  1476      All
2  2015-10-08-01:00:00 22186      All
3  2015-10-08-02:00:00  2958      All
4  2015-10-08-03:00:00  3484      All
5  2015-10-08-04:00:00  4159      All
6  2015-10-08-05:00:00  2960      All
7  2015-10-08-00:00:00   222 Business
8  2015-10-08-01:00:00    26 Business
9  2015-10-08-02:00:00   542 Business
10 2015-10-08-03:00:00    26 Business
11 2015-10-08-04:00:00  4760 Business  
12 2015-10-08-05:00:00  4640 Business
13 2015-10-08-00:00:00  1704   System
14 2015-10-08-01:00:00   100   System
15 2015-10-08-02:00:00   122   System
16 2015-10-08-03:00:00    10   System
17 2015-10-08-04:00:00  3339   System
18 2015-10-08-05:00:00  5370   System"

viz_set<-read.table(text=zz, header = T)

viz_set$Event.Hour <- ymd_hms(viz_set$Event.Hour)

Затем я отображаю данные как объект ggvis и добавляю всплывающую подсказку к интерактивному изображению:

getData1 <- function(dat){
  paste(paste("Value:", dat$Count, "<br />"),
        paste("Time:", dat$Event.Hour))
} 

viz_set %>%
  ggvis(~Event.Hour, ~Count, stroke = ~Group) %>% 
  filter(Group %in% eval(input_checkboxgroup(c("All", "Business", "System"), select = "All"))) %>%
  layer_lines(strokeWidth := 2) %>%
  scale_datetime(property = "x", nice = "hour") %>%
  layer_points(opacity = 0, fill = ~Group) %>%
  add_tooltip(getData1, on = "click") %>%
  add_axis("x", subdivide = 5, tick_size_major=10, tick_size_minor = 5, title = "Event.Hour", title_offset = 30) %>%
  add_axis("y", title = "Count", title_offset = 60)

Полученная всплывающая подсказка отображает даты в формате эпохи Unix, и я не могу понять, как заставить ее просто отображаться как символ.

Внутри функции getData1 я пробовал:

as.character(dat$Event.Hour)

а также

as.POSIXct(dat$Event.Hour, origin = '1970-01-01')

но безрезультатно.

Я также попытался добавить новый столбец с датами в виде строк символов и вместо этого использовал всплывающую подсказку в этом столбце. Ни один из них не работал.

Во-вторых, на результирующем графике ggvis даты и время по оси X не совпадают со значениями. Данные начинаются и заканчиваются за несколько часов до того, как они должны:

Здесь видно, что ось X смещена на несколько часов.

Первая точка данных должна начинаться прямо на линии «Октябрь 08» и заканчиваться в 14:00 среды 14.

Любые идеи?


person danh    schedule 17.11.2015    source источник
comment
Взгляните на как создать воспроизводимый пример и у вас будет больше шансов получить помощь   -  person alexwhan    schedule 18.11.2015
comment
Не могли бы вы привести данные вашего примера через dput, чтобы их было легко читать? Ссылка на комментарий выше показывает хороший пример. Возможно, вы сможете обойти первую проблему, используя key в слое точек и создав функцию всплывающей подсказки, как в последнем примере на странице справки add_tooltip. Затем вы можете использовать эту символьную версию переменной даты и времени, которую вы поместили в свой набор данных.   -  person aosmith    schedule 18.11.2015
comment
Вот открытая проблема в репозитории ggvis github, которая выглядит актуальным для вашей всплывающей подсказки/проблемы с датой и временем.   -  person aosmith    schedule 18.11.2015
comment
@alexwhan Спасибо, Алекс! Я добавил код для воссоздания набора данных, так что теперь все должно быть легко воспроизводимо.   -  person danh    schedule 18.11.2015


Ответы (1)


Похоже, часовой пояс может быть причиной смещения оси. Одно простое решение — просто установить часовой пояс в ymd_dms на часовой пояс вашей системы. После этого все выглядело разумным для меня.

(mytz = Sys.timezone())
[1] "America/Los_Angeles"

viz_set$Event.Hour = ymd_hms(viz_set$Event.Hour, tz = mytz)

С точки зрения всплывающей подсказки, решение проблемы времени в миллисекундах будет заключаться в простом отображении данных из исходного набора данных, а не набора данных, поступающего через ggvis. Вы можете сделать это, используя файл key. Это включает в себя создание переменной id, которая уникальным образом представляет каждую строку в исходном наборе данных.

viz_set$id = 1:nrow(viz_set)

Теперь функция всплывающей подсказки может выглядеть примерно так.

getData2 = function(dat){
    if(is.null(dat$id)) return(NULL)
    row = viz_set[viz_set$id == dat$id, ]
    paste(paste("Value:", row$Count, "<br />"),
         paste("Time:", as.character(row$Event.Hour)))
} 

Обратите внимание, что, в отличие от справочной документации, первая строка функции включает dat$id, а не только dat. Когда я использовал здесь dat, у меня иногда появлялась пустая информация во всплывающей подсказке, если я по ошибке нажимал на линию вместо точки. Моя альтернатива, похоже, решает эту проблему.

Теперь просто добавьте key := ~id к layer_points, чтобы получить значения всплывающей подсказки из фактического набора данных.

viz_set %>%
    ggvis(~Event.Hour, ~Count, stroke = ~Group) %>% 
    filter(Group %in% eval(input_checkboxgroup(c("All", "Business", "System"), select = "All"))) %>%
    layer_lines(strokeWidth := 2) %>%
    scale_datetime(property = "x", nice = "hour") %>%
    layer_points(opacity := 0, fill = ~Group, key := ~id) %>%
    add_tooltip(getData2, on = "click") %>%
    add_axis("x", subdivide = 5, tick_size_major=10, tick_size_minor = 5, title = "Event.Hour", title_offset = 30) %>%
    add_axis("y", title = "Count", title_offset = 60)
person aosmith    schedule 18.11.2015