R,在 Shiny 和 ggvis 中绘制日期的问题

R, problems plotting dates in Shiny and 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

日期是使用 lubridate 的 dmy_hms 函数创建的:

> 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 轴日期时间与值不一致。数据似乎比应有的时间早几个小时开始和结束:

Here you can see that the X-axis is off by a few hours.

第一个数据点应从 The Oct 08 行开始,并应在 14 日星期三下午 2 点结束。

有什么想法吗?

看来时区可能导致轴偏移。一个简单的修复方法是将 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)