Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using Proxy Interface in Plotly/Shiny to dynamically change data

Tags:

r

shiny

r-plotly

I want to update the data present in a plot (displayed in plotlyOutput in a Shiny app) using Proxy Interface. Here is a minimal App.R code :

library(shiny)
library(plotly)

ui <- fluidPage(
    actionButton("update", "Test"),
    plotlyOutput("graphe")
)

server <- function(input, output, session) {
    output$graphe <- renderPlotly({
        p <- plot_ly(type="scatter",mode="markers")
        p <- layout(p,title="test")
        p <- add_trace(p, x=0,y=0,name="ABC_test",mode="lines+markers")
    })

    observeEvent(input$update, {
        proxy <- plotlyProxy("graphe", session) %>%
            plotlyProxyInvoke("restyle", list(x=0,y=1),0)
    })
}

shinyApp(ui, server)

When I run it, the plot is displayed with a dot at (0,0) (as wanted) but when I click of the button "Test", the dot does not move to (0,1). How can I achieve this ?

Thank you for any answer.

like image 946
Julien Vernay Avatar asked May 31 '18 08:05

Julien Vernay


3 Answers

Strangely enough addTracesdoes not work with only one point but works with two points. To make it work you could add the same point twice. So you could try this:

ui <- fluidPage(
  actionButton("update", "Test"),
  plotlyOutput("graphe")
)

server <- function(input, output, session) {
  output$graphe <- renderPlotly({
    p <- plot_ly(type="scatter",mode="markers")
    p <- layout(p,title="test")
    p <- add_trace(p, x=0,y=0,name="ABC_test",mode="lines+markers")
  })

  observeEvent(input$update, {
    plotlyProxy("graphe", session) %>%
    plotlyProxyInvoke("deleteTraces", list(as.integer(1))) %>%
    plotlyProxyInvoke("addTraces", list(x=c(0, 0),y=c(1, 1),
                        type = 'scatter',
                        mode = 'markers'))
  })
}

shinyApp(ui, server)
like image 191
MLavoie Avatar answered Oct 06 '22 17:10

MLavoie


The restyle API is a bit wonky...I forget the reasoning, but data arrays like x and y need double arrays. I'd do it this way:

library(shiny)
library(plotly)

ui <- fluidPage(
  actionButton("update", "Test"),
  plotlyOutput("graphe")
)

server <- function(input, output, session) {
  output$graphe <- renderPlotly({
    plot_ly() %>%
      add_markers(x = 0, y = 0, name = "ABC_test") %>%
      layout(title = "test")
  })

  observeEvent(input$update, {
    plotlyProxy("graphe", session) %>%
      plotlyProxyInvoke("restyle", "y", list(list(1)), 0)
  })
}

shinyApp(ui, server)
like image 21
Carson Avatar answered Oct 06 '22 16:10

Carson


library(shiny)

ui <- fluidPage(
    actionButton("update", "Test"),
    plotlyOutput("graphe")
)

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

    output$graphe <- renderPlotly({
        plot_ly() %>%
            layout(title="test") %>%
            add_trace(x=runif(2), y=runif(2), name="ABC_test", type="scatter", mode="lines+markers")
    })

    observeEvent(input$update, {
        plotlyProxy("graphe", session, FALSE) %>%
            plotlyProxyInvoke("deleteTraces", list(as.integer(0))) %>%
            plotlyProxyInvoke("addTraces", list(x=runif(2),
                                                y=runif(2),
                                                name="ABC_test",
                                                type = 'scatter',
                                                mode = 'lines+markers'))
    })

}

shinyApp(ui, server)
like image 1
Simon Woodward Avatar answered Oct 06 '22 18:10

Simon Woodward