plotly / plotly/plotly.R

Unable to index traces with a continuous legend using both add_trace and plotlyproxyinvoke "add_trace"

Open
#2,390 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
R
Stars
2.7k
Forks
641
PR merge metrics
No merged PRs in 30d

Description

I have a number of plots that I am trying to synchronize and draw a highlighted point on in response to a users search. This works fine except when they are in tabs. Plotly proxy can't add a trace to graph that is not yet drawn, and in Shiny there isn't a good way to trigger an event after the plot is drawn. Subsequently I have added a manual add_trace check to see if a search has found a point that needs to be highlighted. However, when I add a trace directly to the figure. The traces are added in different orders, I gather the legend is added after both traces are defined. It appears that a continuous legend gets added as a trace, after all traces are drawn. So in a different order than when invokeProxy.

So in scenario one when a plot has been drawn and I add a trace the new trace has an index of 2, however if I draw the plot then add it within the same render function the legend has an index of 2.

It's really difficult to generate a reproducible example here, as I have done a number of tests, and things are pretty confusing. For example, if I add a name variable. name= ~SERIAL_NUM then for some reason each point gets it's own trace index. However, this obliterates the hover text for some reason.

library(shiny)
library(plotly)

ui <- fluidPage(
  plotlyOutput("plot"),actionButton(label="add","addtrace"),actionButton(label="delete","deletetrace")
)




server <- function(input, output, session) {
   plotproxy <- plotlyProxy("plot", session=session, deferUntilFlush=FALSE)
 
  
  output$plot <- renderPlotly({
    a = seq(1,10,1)
    b = seq(100,1000,100)
    c = seq(1,4.9,0.4)
    
    data = tibble(a,b,c)
    data <- data %>% mutate(res = a+b+c)
    
    layout_details <- list(xaxis = list(title = 'a [-]'),
                           yaxis = list(title = 'b [-]'),
                           zaxis = list(title = 'c [-]'),
                           coloraxis=list(colorbar=list(title=list(text='Here are the results'))))
    
    p = plot_ly(data, x = ~a, y = ~b , color = ~res, type = 'scatter', 
                mode = 'markers', text = ~res, showlegend = FALSE, scene = 'scene1',hovertemplate = paste('<b><b>SERIAL_NUM</b>:  %{text}'))
    p
  })
  

  observeEvent(input$addtrace, {
    plotproxy%>%plotlyProxyInvoke("addTraces", list(list( 
      x =  list(2),
      y = list(2),
      type = 'scatter',
      mode = 'markers' ,
      marker = list(size = 10,
                    color = 'rgba(255, 18 , 19 , .9)',
                    line = list(color = 'rgba(0, 0, 0, .3)',
                                width = 3))
    )))
    
  
  
})
  observeEvent(input$deletetrace, {
    plotproxy%>%plotlyProxyInvoke("deleteTraces",2)
    
    
  })
}
shinyApp(ui, server)

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the supplied Shiny example using renderPlotly, plotlyProxyInvoke("addTraces"), and deleteTraces, and compare trace ordering when the continuous legend is created during rendering versus afterward. Reproduce the differing indexes and verify that adding and deleting the highlighted trace target the intended trace consistently.

Written by the indexing model from the issue text.

Assessment

Tech stack
javascript, r
Domain
data-visualization
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
28/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.