2015-09-14 7 views
8

Sto cercando di ottenere lo zoom interattivo per lavorare su ggvis, più in particolare lo zoom usando un pennello. Giudicando da https://github.com/rstudio/ggvis/issues/143 ho pensato che questo dovrebbe funzionare.Non riesco a ottenere lo zoom interattivo per lavorare con ggvis

Ho il seguente codice lucido e ggvis (è completamente riproducibile):

## 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') 
}) 

Così, non appena un pennello viene disegnato, i domini reattivi è cambiato, che a sua volta cambia il dominio del x scale_numeric. Se hanno ancora le seguenti sfide:

  • All'interno zoom_brush ho ottenere le coordinate del pennello, ma nel sistema di pixel della trama sistema di coordinate non coordinata dominio. Come posso tradurre i pixel nella scala del dominio? In d3 posso semplicemente usare l'intervallo per ridimensionare le funzioni di trasformazione, ma non vedo come siano disponibili in ggvis (via vega).
  • La funzione handle_brush supporta solo l'impostazione di un gestore eventi on_move. In questo caso voglio solo attivare lo zoom se il pennello finisce, quindi l'evento onmouseup nel contesto del pennello. Temo che questo semplicemente non sia possibile in questo momento?
  • Solo quando si imposta clamp = TRUE si ottiene uno zoom efficace. In non, i punti fuori dal dominio sono ancora mostrati e solo gli assi sono impostati sul nuovo dominio. C'è una soluzione facile per questo? O dovrei rendere il set di dati un reattivo, e suddividerlo in base al dominio che è stato impostato dal pennello?

Corro la seguente versione di R e versioni del pacchetto.

> 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

Se non è necessario fare affidamento su 'ggvis' forse [questo esempio] (http://shiny.rstudio.com/gallery/plot-interaction-zoom.html) funzionerebbe? – JasonAizkalns

+0

@jason grazie per il feedback. Sono a conoscenza di questa opzione e questa domanda è specificamente rivolta a ggvis. –

risposta

1

penso che è necessario sottoinsieme dei dati: ggvis non sembra ancora abbastanza intelligente da ignorare di punti scala. I seguenti server.R funziona per me:

## 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') 

}) 
Problemi correlati