2015-09-14 7 views
8

Ich versuche, interaktives Zoomen in ggvis zu verwenden, insbesondere beim Zoomen mit einem Pinsel. Nach Meinung von https://github.com/rstudio/ggvis/issues/143 dachte ich, das sollte funktionieren.Interaktives Zoomen funktioniert nicht mit ggvis

Ich habe folgende glänzend und ggvis Code (ist vollständig reproduzierbar):

## ui.R 
library(ggvis) 

shinyUI(fluidRow(
    uiOutput('ui_plot1'), 
    ggvisOutput("graph_plot1") 
)) 

## server.R 
shinyServer(function(input, output, session) { 
    domains <- reactiveValues(x = c(NA, NA), y = c(NA, NA)) 

    zoom_brush = function(items, session, page_loc, plot_loc, ...) { 
    domains$x = c(200, 400) 
    } 

    plot = reactive({ 
    mtcars %>% 
     ggvis(~disp, ~mpg) %>% 
     layer_points() %>% 
     scale_numeric('x', domain = domains$x, clamp = TRUE) %>% 
     handle_brush(zoom_brush) 
    }) %>% bind_shiny('graph_plot1', 'ui_plot1') 
}) 

So, sobald eine Bürste gezogen wird, die Domänen reaktiv verändert wird, was wiederum ändert die Domäne der x scale_numeric. Wenn nach wie vor folgende Herausforderungen:

  • Innen zoom_brush erhalte ich die Koordinaten der Bürste, aber in dem Pixelkoordinatensystem des Plots nicht die Domäne-Koordinatensystem. Wie kann ich die Pixel in die Domänenskala übertragen? In d3 kann ich einfach den Bereich verwenden, um Transformationsfunktionen zu skalieren, aber ich sehe nicht, wie diese in ggvis (über Vega) verfügbar sind.
  • Die handle_brush-Funktion unterstützt nur das Festlegen eines on_move-Ereignishandlers. In diesem Fall möchte ich nur den Zoom auslösen, wenn der Pinsel fertig ist, also das onmouseup Event im Kontext des Pinsels. Ich fürchte, das ist im Moment einfach nicht möglich?
  • Nur wenn ich clamp = TRUE setze bekomme ich einen effektiven Zoom. In diesem Fall werden die Punkte außerhalb der Domäne weiterhin angezeigt, und nur die Achsen werden auf die neue Domäne festgelegt. Gibt es eine einfache Lösung dafür? Oder sollte ich den Datensatz reaktiv machen und ihn basierend auf der Domäne, die vom Pinsel gesetzt wurde, unterteilen?

Ich führe die folgenden R-Version und Paket-Versionen.

> sessionInfo() 
R version 3.1.1 (2014-07-10) 
Platform: x86_64-apple-darwin10.8.0 (64-bit) 

locale: 
[1] C 

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] ggvis_0.4.1 shiny_0.12.0 

loaded via a namespace (and not attached): 
[1] DBI_0.3.1  R6_2.0.1  Rcpp_0.11.6  assertthat_0.1 digest_0.6.8 dplyr_0.4.1  htmltools_0.2.6 httpuv_1.3.2 
[9] jsonlite_0.9.16 lazyeval_0.1.10 magrittr_1.5 mime_0.3  parallel_3.1.1 tools_3.1.1  xtable_1.7-4 
+0

Wenn Sie auf [diesem Beispiel] nicht verlassen sich auf 'ggvis' vielleicht (http://shiny.rstudio.com/gallery/plot-interaction-zoom.html) würde funktionieren? – JasonAizkalns

+0

@jason danke für die Rückmeldung. Ich bin mir dieser Möglichkeit bewusst und diese Frage richtet sich speziell an ggvis. –

Antwort

1

Ich glaube, Sie benötigen, um Ihre Daten zu Teilmenge: ggvis noch nicht klug erscheinen genug aus Skalenpunkte zu ignorieren. Folgende server.R funktioniert bei mir:

## server.R 
shinyServer(function(input, output, session) { 

    domains <- reactiveValues(x = c(NA, NA), y = c(NA, NA)) 

    mtcars_reactive <- reactive({ 
    if (anyNA(domains$x)) 
     mtcars 
    else 
     mtcars[mtcars$disp >= domains[["x"]][1] & mtcars$disp <= domains[["x"]][2], ] 
    }) 

    zoom_brush = function(items, page_loc, session, ...) { # plot_loc 
    print(items) 
    message("page_loc") 
    print(page_loc) 
    print(session) 
    domains$x = c(200, 400) 
    } 

    reactive({ 
    mtcars_reactive() %>% 
     ggvis(~disp, ~mpg) %>% 
     layer_points() %>% 
     handle_brush(zoom_brush) 
    }) %>% bind_shiny('graph_plot1', 'ui_plot1') 

})