【问题标题】:R, problems plotting dates in Shiny and ggvisR,在 Shiny 和 ggvis 中绘制日期的问题
【发布时间】:2015-11-17 23:54:02
【问题描述】:

我对 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 点结束。

有什么想法吗?

【问题讨论】:

  • 看看how to create a reproducible example,您将更有可能获得帮助
  • 您能否通过dput 提供您的示例数据,以便阅读?上面的评论链接显示了一个很好的例子。您可以在点层中使用key 解决第一个问题,并在add_tooltip 帮助页面的最后一个示例中创建工具提示函数。然后,您可以使用您放入数据集中的日期时间变量的字符版本。
  • 这是 ggvis github 存储库上的 open issue,看起来与您的工具提示/日期时间问题相关。
  • @alexwhan 谢谢亚历克斯!我添加了一些代码来重新创建数据集,所以现在一切都应该很容易重现。

标签: r shiny ggvis posixct


【解决方案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)

【讨论】:

    猜你喜欢
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    • 2017-06-18
    • 2011-12-17
    • 1970-01-01
    • 2019-10-05
    • 1970-01-01
    • 2012-10-30
    相关资源
    最近更新 更多