2014-07-01 4 views
11

To mój zestaw danych wejściowych:Dodawanie danych do ggvis podpowiedzi, który jest zawarty w zbiorze danych wejściowych, ale nie bezpośrednio w 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"  

dla mojego ggvis używam następujące zmienne firstaired.posix i 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 ... 

pomyślnie utworzony mój ggvis z podpowiedzi zawierającą informacje rating takiego:

> 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") 

Ale faktycznie chcę tooltip zawierać więcej danych, jak zmiennej epid, więc próbowałem:

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

... Korzystanie as.character() ponieważ epid jest uporządkowanym czynnik - Ale część podpowiedzi jest pusty. (Zauważyłem także, że brak linii, którą zamierzałem zamieścić \n, jest niewystarczający, ale to inny problem).

Wygląda na to przyczyna tego problemu jest to, że vis obiekt utworzony przez rurociągi mój zestaw danych do ggvis nie zawiera informacje I chcesz wyświetlić, przynajmniej dlatego zebrane przez pominie wyjściu str() w sprawie pierwszy przykład.

EDYCJA: Rozwiązałem ten problem z liniami, więc nie ma potrzeby, aby zwracać mi uwagę na ?add_tooltip - całkowicie o tym zapomniałem.

EDYCJA: Przyjęta odpowiedź działa dobrze, nawet jeśli nie pozwala mi umieścić dowolnych zmiennych w etykiecie narzędzi, to jest prawie to, czego potrzebuję do mojego użycia, dzięki! Oto co zrobiłem w końcu:

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") 
+0

Co się stanie, jeśli umieścić 'add_tooltip' przed' ggvis'? –

+0

Nie działa, ponieważ 'add_tooltip' bierze" vis "jako swój pierwszy argument, a vis jest generowany przez' ggvis() '. – Jemus42

+0

wymyśliłeś to? Klucz musi być unikalny. –

Odpowiedz

20

Tak, jest to możliwe. Zwykle klient przesyła tylko kolumny danych, które faktycznie znajdują się na wykresie. Aby dostać się do innych kolumn, należy użyć klucza do indeksu do oryginalnych danych: Jest to prosty przykład powtarzalne

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") 
+0

Dzięki! Wybrałem odpowiedź jako zaakceptowaną, ponieważ obejmuje to samo rozwiązanie co poprzednia odpowiedź, ale zapewnia również prosty, powtarzalny przykład. – Jemus42

+0

to jest świetne. byłoby jeszcze lepiej, gdyby etykietka nie była czcionką szeryfową. – Henk

+3

Czy jest jakaś znana wada tego podejścia, która zależy od rodzaju wykresu? Mam przykład gdzie mam warstwę layer_lines() i warstwę layer_points().Kiedy dodaję wejście "key: = ~ id" do ggvis, dziwnie sprawia, że ​​layer_lines() znika z wykresu. Jest to dość skomplikowany przykład, więc nie mam jeszcze powtarzalnego kodu, ale pomyślałem, że najpierw zapytam, czy są jakieś znane problemy. – dsh

2

Jeden obejście jest przekazać zmienną EPID w nieruchomości key, który jest zwykle oznaczało śledzić których obserwacje odpowiadają sobie wzajemnie podczas przejścia ale to pożądany efekt tutaj z tym ePID w danych bez wytwarzania żadnych skutków ubocznych:

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") 

Jeśli potrzebne do korzystania zmienną wiele z pierwotnego zestawu danych można dodać kolumnę id z unikalną wartość dla każdego wiersza, a następnie wykonaj następujące czynności:

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") 
Powiązane problemy