Search code examples
javascriptrplotlyr-plotly

Is there any way to display all datapoints by default without hovering?


Plot Area Need to find out if there is any way to display all the points in the beginning itself without the need to hover. Based on the selected legend all the datapoints need to be displayed.

  library(plotly)
library(tidyr)
library(plyr)
library(htmlwidgets)
data <- spread(Orange, Tree, circumference)
data <- rename(data, c("1" = "Tree1", "2" = "Tree2", "3" = "Tree3", "4" = "Tree4", "5" = "Tree5"))

fig <- plot_ly(data, x = ~age, y = ~Tree1, type = 'scatter', mode = 'lines', name = 'Tree 1')
fig <- fig %>% add_trace(y = ~Tree2, name = 'Tree 2')
fig <- fig %>% add_trace(y = ~Tree3, name = 'Tree 3')
fig <- fig %>% add_trace(y = ~Tree4, name = 'Tree 4')
fig <- fig %>% add_trace(y = ~Tree5, name = 'Tree 5')
fig <- fig %>% layout(legend = list(x = 0.1, y = 0.9))

fig
        
        javascript <- "
        var myPlot = document.getElementsByClassName('plotly')[0];
        myPlot.on('plotly_hover', function(data) {
          var hover = [];
          for (var i = 0; i < data.points[0].data.x.length; i += 1) {
            hover.push({curveNumber: data.points[0].curveNumber,
                        pointNumber: i});
          }
          Plotly.Fx.hover(myPlot, hover);
        });"
        fig <- htmlwidgets::prependContent(fig, onStaticRenderComplete(javascript), data = list(''))
        fig

Solution

  • Here is a solution based on add_text(...), and not using any custom JS. You may need to adapt it for the correct look and feel. It was necessary to use legendgroupand showlegend arguments to get the required behaviour.

    fig <- plot_ly(data, x = ~age, y = ~Tree1, type = 'scatter', mode = 'lines+markers', name  = 'Tree 1', legendgroup  = 'Tree 1')
    fig <- fig %>% add_text(y = ~Tree1, text = ~paste0("(", age, ", ", Tree1, ")"), legendgroup  = 'Tree 1', showlegend=FALSE)
    fig <- fig %>% add_trace(y = ~Tree2, name  = 'Tree 2', legendgroup  = 'Tree 2')
    fig <- fig %>% add_text(y = ~Tree2, text = ~paste0("(", age, ", ", Tree2, ")"), legendgroup  = 'Tree 2', showlegend=FALSE)
    fig <- fig %>% add_trace(y = ~Tree3, name = 'Tree 3', legendgroup  = 'Tree 3')
    fig <- fig %>% add_text(y = ~Tree3, text = ~paste0("(", age, ", ", Tree3, ")"), legendgroup  = 'Tree 3', showlegend=FALSE)
    # etc for Trees 4 and 5
    fig <- fig %>% layout(legend = list(x = 0.1, y = 0.9))
    
    fig