Добавьте данные в подсказку ggvis, содержащуюся во входном наборе данных, но не непосредственно в vis
Это мой входной набор данных:
> 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.posix
и rating
:
> 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 ...
Я успешно создал мой ggvis
с помощью всплывающей подсказки, содержащей информацию 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
вставить, отсутствует, но это другая проблема).
Похоже, что причиной этой проблемы является то, что объект vis
, созданный путем переноса моего набора данных в ggvis
, не содержит информации, которую я хочу отобразить, по крайней мере, поэтому я собрал, просмотрев вывод str()
в первом примере.
EDIT: я решил эту проблему, поэтому нет необходимости указывать мне на ?add_tooltip
- полностью забыл об этом.
EDIT: принятый ответ работает нормально, хотя он не позволяет мне помещать произвольные переменные во всплывающую подсказку, это в значительной степени то, что мне нужно для моего использования, спасибо!
Вот что я сделал в конце:
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")
Ответы
Ответ 1
Да, это возможно. Обычно клиент отправляет обратно столбцы данных, которые фактически находятся в графике. Чтобы получить другие столбцы, вы должны использовать ключ для индексирования в исходные данные: Это простой воспроизводимый пример
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")
Ответ 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")