将包含在输入数据集中但不直接在可视化中的数据添加到ggvis工具提示

11

这是我的输入数据集:

> names(breakingbad.episodes)
[1] "season"           "episode"          "epnum"            "epid"             "title"           
[6] "url.trakt"        "firstaired.utc"   "id.tvdb"          "rating"           "votes"           
[11] "loved"            "hated"            "overview"         "firstaired.posix" "year"            
[16] "zrating.season"   "src"     

对于我的ggvis,我正在使用以下变量firstaired.posixrating

> str(breakingbad.episodes[c("firstaired.posix", "rating")])
'data.frame':   62 obs. of  2 variables:
$ firstaired.posix: POSIXct, format: "2008-01-21 02:00:00" "2008-01-28 02:00:00" "2008-02-  11 02:00:00" ...
$ rating          : num  87 85 84 84 83 90 87 85 88 83 ...

我成功地创建了一个包含评级信息的tooltip rating,示例如下:

> breakingbad.episodes %>% 
ggvis(x = ~firstaired.posix, 
    y = ~rating, 
    fill = ~season) %>% 
layer_points() %>%
add_axis("x", title = "Airdate") %>%
add_axis("y", title = "Rating") %>%
add_legend("fill", title = "Season") %>%
add_tooltip(function(data){paste0("Rating: ", data$rating)}, "hover")

但是我实际上希望工具提示包含更多的数据,例如epid变量,因此我尝试:

…
add_tooltip(function(data){paste0("Rating: ", data$rating, "\n", "Epid: ", as.character(data$epid))}, "hover")

使用as.character(),因为epid是一个有序的因子——但提示框的一部分是空的。(我也注意到我打算插入的换行符\n不存在,但这是另一个问题)。

看起来这个问题的原因是,通过将我的数据集传递到ggvis中创建的vis对象不包含我想要显示的信息,至少这就是我通过查看第一个示例上str()输出时收集到的信息。

编辑:我解决了那个换行符的问题,所以不需要指向?add_tooltip——完全忘记了那个。

编辑:虽然它不允许我在提示框中放置任意变量,但被接受的答案很好,对于我的用例来说基本上就是我需要的,谢谢!这是我最终的做法:

breakingbad.episodes <- transform(breakingbad.episodes, id = paste0(epid, " - ", title))

breakingbad.episodes %>% 
  ggvis(x = ~firstaired.posix, 
      y = ~rating, 
      fill = ~season, 
      key := ~id) %>% 
  layer_points() %>%
  add_axis("x", title = "Airdate") %>%
  add_axis("y", title = "Rating") %>%
  add_legend("fill", title = "Season") %>%
  add_tooltip(all_values, "click")

如果您在ggvis之前放置add_tooltip会发生什么? - Scott Ritchie
不起作用,因为 add_tooltip 接受一个 vis 作为它的第一个参数,而该 vis 是由 ggvis() 生成的。 - Jemus42
你想弄清楚这个吗?关键字必须是唯一的。 - David Crook
2个回答

20

是的,这是可能的。通常客户端只会发送绘图中实际存在的数据列。要获取其他列,您应该使用一个键来索引原始数据:下面是一个简单可重现的示例。

library(ggvis)
mtc <- mtcars
mtc$id <- 1:nrow(mtc)

all_values <- function(x) {
  if(is.null(x)) return(NULL)
  row <- mtc[mtc$id == x$id, ]
  paste0(names(row), ": ", format(row), collapse = "<br />")
}

mtc %>% ggvis(x = ~wt, y = ~mpg, key := ~id) %>%
  layer_points() %>%
  add_tooltip(all_values, "hover")

谢谢!我选择了您的答案作为已接受的答案,因为它涵盖了与先前答案相同的解决方案,但也提供了一个简单可重复的例子。 - Jemus42
这很棒。如果工具提示不使用笨重的衬线字体,那就更好了。 - Henk
3
这种方法是否存在任何已知的缺点,这些缺点与图形类型有关?我有一个例子,其中包含一个layer_lines()层和一个layer_points()层。当我在ggvis中添加“key:=~id”的输入时,奇怪的是会使layer_lines()在图形中消失。这是一个比较复杂的例子,所以我暂时无法提供可重现的代码片段,但我想先问一下是否有任何已知问题。 - dsh
这种方法不适用于 layer_bars()。在这种情况下,它会给出以下错误:Error in eval(expr, envir, enclos) : object 'id' not found。有什么办法可以解决吗?(例如,您想绘制计数并将共享信息作为工具提示)。 - janosdivenyi

2

一个解决方法是将epid变量传递给key属性,该属性通常用于在转换期间跟踪哪些观察结果彼此对应,但它在这里具有包括epid在数据中而不产生任何副作用的所需效果:

breakingbad.episodes <- data.frame(firstaired.posix = as.POSIXct(c("2008-01-21 02:00:00", "2008-01-28 02:00:00")),
rating = c(87, 85), epid = as.factor(c(12,23)), season = as.factor(c(1,2)), somevar = c("special", "very_special"))

breakingbad.episodes %>% 
  ggvis(x = ~firstaired.posix, 
        y = ~rating, 
        fill = ~season, key := ~epid) %>% 
  layer_points() %>%
  add_axis("x", title = "Airdate") %>%
  add_axis("y", title = "Rating") %>%
  add_legend("fill", title = "Season") %>%
  add_tooltip(function(data){paste0("Rating: ", data$rating, "\n", "Epid: ", as.character(data$epid))}, "hover")

如果您需要使用原始数据集中的多个变量,可以添加一个id列,为每一行设置一个唯一值,然后执行以下操作:

breakingbad.episodes <- data.frame(id = c(1,2), firstaired.posix = as.POSIXct(c("2008-01-21 02:00:00", "2008-01-28 02:00:00")),
rating = c(87, 85), epid = as.factor(c(12,23)), season = as.factor(c(1,2)), somevar = c("special", "very_special"))

breakingbad.episodes %>% 
  ggvis(x = ~firstaired.posix, 
        y = ~rating, 
        fill = ~season, key := ~id) %>% 
  layer_points() %>%
  add_axis("x", title = "Airdate") %>%
  add_axis("y", title = "Rating") %>%
  add_legend("fill", title = "Season") %>%
  add_tooltip(function(data){paste0("Rating: ", data$rating, "\n", "Epid: ",
as.character(breakingbad.episodes$epid[breakingbad.episodes$id == data$id]), "\n", 
"What this is: ", breakingbad.episodes$somevar[breakingbad.episodes$id == data$id])}, "hover")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接