2014-07-01 6 views
11

Dies ist meine Eingabedatei:Daten ggvis Tooltip hinzufügen, die in dem Eingabedatensatz enthalten sind, aber nicht direkt in den 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"  

Für meine ggvis ich die folgenden Variablen bin mit firstaired.posix und 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 ... 

ich habe erfolgreich mein ggvis mit einem Tooltip die rating Informationen wie diese enthalten:

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

Aber ich will eigentlich den Tooltip, um mehr Daten, wie die epid Variable enthalten, also habe ich versucht:

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

... Mit as.character() weil epid ein geordneter Faktor ist - aber der Teil des Tooltip ist leer. (Ich bemerkte auch den Zeilenumbruch, den ich beabsichtigte \n einzufügen, fehlt, aber das ist ein anderes Problem).

Es ist wie die Ursache für dieses Problem sieht, ist, dass das vis Objekt erstellt von meinem Dataset in ggvis kochend enthält nicht die Informationen, die ich angezeigt werden soll, zumindest das ist, warum ich, indem Sie durch die Ausgabe von str() auf der geraffte erstes Beispiel.

EDIT: Ich löste dieses linebreak Problem, so dass es mich nicht ?add_tooltip zeigen muss - total vergessen.

EDIT: Die angenommene Antwort funktioniert gut, auch wenn es mich nicht erlaubt willkürliche Variablen in den Tooltip zu setzen, ist es ziemlich genau das, was ich für meinen Anwendungsfall brauche, danke! Hier ist, was ich am Ende tat

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

Was passiert, wenn Sie den 'add_tooltip' vor dem' ggvis' setzen? –

+0

Funktioniert nicht, weil 'add_tooltip' ein' vis' als erstes Argument verwendet und vis von 'ggvis()' generiert wird. – Jemus42

+0

Sie finden das heraus? Der Schlüssel muss einzigartig sein. –

Antwort

20

Ja, das ist möglich. Normalerweise sendet der Client nur die Datenspalten zurück, die sich tatsächlich im Plot befinden. Um weitere Spalten zu erhalten, sollten Sie einen Schlüssel zum Index in die Originaldaten verwenden: Dies ist einfach reproduzierbar Beispiel

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

Danke! Ich habe Ihre Antwort als akzeptiert gewählt, weil sie dieselbe Lösung wie die vorherige Antwort behandelt, aber auch ein einfaches reproduzierbares Beispiel bietet. – Jemus42

+0

das ist großartig. es wäre noch besser, wenn der Tooltip nicht in einer klobigen Serifenschrift wäre. – Henk

+3

Gibt es einen bekannten Nachteil dieses Ansatzes, der von der Art des Diagramms abhängt? Ich habe ein Beispiel, wo ich eine Schicht_Lines() Schicht und eine Schicht_Punkte() Schicht habe.Wenn ich den "key: = ~ id" -Eingang zum ggvis hinzufüge, wird die layer_lines() merkwürdigerweise aus dem Plot verschwinden. Es ist ein etwas komplexes Beispiel, daher habe ich noch kein reproduzierbares Stück Code, aber ich dachte, ich würde zuerst fragen, ob es irgendwelche bekannten Probleme gäbe. – dsh

2

Eine Abhilfe ist, die epid Variable in der key Eigenschaft passieren, die normalerweise den Überblick zu behalten ist gemeint, von denen Beobachtungen miteinander während der Übergänge entsprechen, aber es hat die gewünschte bewirken hier von epid in den Daten, die ohne Nebenwirkungen zu produzieren:

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

Wenn Sie mehrere variablen aus der ursprünglichen Datensatzes zu verwenden, benötigt man eine id Spalte mit einem eindeutigen Wert für jede Zeile hinzufügen und dann wie folgt vorgehen:

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