2016-12-19 45 views
2

總體目標更新大型地塊,而無需重新渲染

我想能夠使用RShiny快速繪製大量是來自R數據,然後進行小的修改或補充而不重 - 提供所有繪製的數據。

特殊任務

  1. 劇情在散點圖中的大量的點(< 100 000)。我可以用短時間(< 5秒),但在這個任務中可以感覺到延遲。
  2. 響應鼠標點擊,檢測最近的繪製點。
  3. 使用從與這一點相關的數據中查詢的一些信息,突出顯示少數其他點(< 10)。我希望這是瞬間的。

當前的方法

我目前使用GGPLOT2和RShiny使應用程序,以幫助數據分析。總的來說,我對這種組合非常滿意。所以理想的解決方案將允許我仍然主要使用這些工具。

只使用RShiny和GGPLOT2的內置功能,我沒有問題,完成我的任務,除了是第3步不能獨立完成,無需重做步驟1我的理解,這是不可能的更新或覆蓋ggplot2繪圖而無需全部重新渲染它們。

所以,我在找的是以下實現我的總體目標之一,在偏好的降序排列:

  1. 重疊或修改GGPLOT2地塊,而無需重新渲染方式。
  2. 擴展名或叉或類似的基於R的ggplot2,允許這樣做。
  3. ggplot2的替代方法同樣易於與RShiny和R數據集成,可以實現這一點。也許一個現有的JavaScript庫的一些接口?我仍然希望能夠使用我熟悉的所有RShiny機器來操作和與我的情節進行交互。

我對js有一些瞭解,但不想像學習類似d3的東西來完成這樣一個小任務。 (如果可以使用一小部分d3或js來做到這一點,那將會很棒!)能夠在ggplot2圖上有效地繪製svg,但使用相同的座標系是很好的。

我知道this question,但提供的解決方案是特定於時間序列數據的。

+0

你看過'plotly'嗎?它有一些互動性。還有'ggvis',但它還沒有完成 - 顯然。 –

+0

我簡單地看了一下。我的印象是,ggplotly函數在完成步驟1時要慢得多。如果有一種方法可以用一些精簡的方式對R使用,那麼這可能是好的。我不熟悉ggvis,也許這就是票。 – mb7744

+0

'ggvis'是Hadley Wickam的下一個大作,應該爲ggplot增加交互性。不幸的是,它最初需要進行比他想象的更多的重組,所以它比原先宣佈的要長一兩年。 –

回答

0

以下是plotly的解決方案。它會重新渲染整個劇情,但速度很快,所以可能仍然會滿足您的要求。我想你會看到引入Plotly不應該大大地破壞你的工作流程。

請注意,我使用Plotly的WebGL function來獲得速度。下面的例子是100000點。我還包括了一個如何轉換現有的對象的例子。對於Plotly單擊事件,see this

library(shiny) 
library(dplyr) 
library(plotly) 
library(ggplot2) 

ui <- fluidPage(

    titlePanel("Highlight nearby points"), 

    sidebarLayout(
    sidebarPanel(width=3, 
     p("Click on a point. Nearby points will be highlighted.") 
    ), 

    mainPanel(
     plotlyOutput("plot") 
    ) 
) 
) 

# Data 
df <- tibble(x = runif(1e+05,1,100), y = runif(1e+05,1,100)) 

server <- function(input, output, session) { 

    output$plot <- renderPlotly({ 

    # Gather click data 
    event.data <- event_data("plotly_click") 

    # Plotly object 
    p <- plot_ly(df, x = ~x, y = ~y, type = "scatter", mode = "markers") 

    # Alternative: use existing ggplot 

    # gg <- ggplot(df, aes(x = x, y = y)) + 
    # geom_point() 
    # 
    # p <- plotly_build(gg) 

    # End alternative 

    # Check for click data 
    if(!is.null(event.data)) { 

     # If click data exists, create new markers based on range criteria and use a different color 
     d <- filter(df, 
        x < event.data$x+10 & x > event.data$x-10, 
        y < event.data$y+10 & y > event.data$y-10) 
     p <- add_markers(p, data = d, color = I("red")) 

    } 

    # Use webGL for faster ploting of many points 
    p %>% toWebGL() 

    }) 
} 

# Run the application 
shinyApp(ui = ui, server = server) 
+0

我非常欣賞這個努力,但至少對我來說,這個解決方案比沒有積極地做同樣的事情更糟糕。如果情節仍然需要重建的陰謀,我不知道它的用途增加了我的問題。 – mb7744

+0

比較表現:https://gist.github.com/anonymous/380198a563e9dfce27a72b8c468315a2 – mb7744

+0

@ mb7744有趣的是,它實際上對我來說有點慢。好吧,我會再想一想,但我不確定如何在不重新渲染的情況下輸出繪圖對象。您需要使渲染對象無效才能更新輸出。這樣做,它會運行渲染器內的所有代碼。 –