Avoid ordering hoverinfo by group when using legendgroup in plotly

Hi,

I have build a Gantt chart in plotly as per example. I want to use trace filtering with plotly legend, but the code creates an enormous amount of traces which results in hundreds of traces in legend as well. To avoid that - I first use add_lines() on one row per each group with parameter showlegend = T and by specifying legendgroup . After that, I add the remaining lines to the figure with showlegend = F and by specifying the same legendgroup . This works great for the problem, but using legendgroup messes the text flow inside hoverinfo . Namely, it groups and orders the text by legendgroup instead of allowing them to be ordered by xaxis value.

Data (an excerpt from Soderberg's Sex, Lies & Videotape :)):

library(plotly)
library(dplyr)
df_plotly = structure(list(tt = 1:9, speaker = c("A", "T", "A", "T", "A", 
    "T", "A", "T", "A"), min_time = c(42.328, 50.67, 53.297, 79.073, 
    87.54, 116.569, 120.948, 122.45, 131.959), max_time = c(50.5, 
    55.67, 81.573, 86.203, 112.938, 121.569, 125.948, 130.413, 136.959
    ), line = c("</br> Garbage.</br>All I've been thinking about all week is garbage.</br>I mean, I can't stop thinking about it.", 
    "</br> What kind of thoughts about garbage?", "</br> I just</br>I've gotten real concerned over what's gonna happen with all the garbage.</br>I mean, we've got so much of it.</br>You know? I mean, we have to run out of places to put this stuff eventually.</br>The last time I .</br>I started feelin' this way is when that barge was stranded</br>and, you know, it was going around the island and nobody would claim it.</br>Do you remember that?", 
    "</br> Yes, I remember.</br>Do you have any idea what may have triggered this concern?", 
    "</br> Yeah. Yeah.</br>You see, the other night, John was taking out the garbage,</br>and he kept spilling things out of the container,</br>and that made me</br>I started imagining, like,</br>a garbage can that produces garbage, and it doesn't stop.</br>It just keeps producing garbage, and it just keeps overflowing.</br>And, yy-you know, what would you do, you know, to try to stop something like that?", 
    "</br> Ann, do you see any pattern here?", "</br> What do you mean?", 
    "</br> Well, last week we were talking about your obsession</br>with the families of airline fatalities.</br>Now we're talking about your concern over the garbage problem.", 
    "</br> Yeah? So?"), color = structure(c(1L, 2L, 1L, 2L, 1L, 2L, 
    1L, 2L, 1L), .Label = c("#66C2A5", "#FC8D62"), class = "factor")), row.names = c(NA, 
    -9L), class = c("tbl_df", "tbl", "data.frame"))

Gantt without legend with correct order inside hoverinfo:

fig = plot_ly() %>% layout(hovermode = "x unified")
    
for(i in 1:(nrow(df_plotly) - 1)){
  
  df = 
    df_plotly 
  
  fig <- add_lines(fig,
                   x = c(df$min_time[i], df$max_time[i]),  # x0, x1
                   y = c(df$speaker[i], df$speaker[i]),  # y0, y1
                   name = df$speaker[i],
                   mode = "lines",
                   line = list(color = df$color[i], width = 20),
                   hoverinfo = "text",
                   text = df$line[i],
                   
                   evaluate = T  # needed to avoid lazy loading
  )
}

fig 

Gantt with legend but with incorrect order inside hoverinfo :

fig = plot_ly() %>% layout(hovermode = "x unified")

for(i in 1:2){
  df = 
    df_plotly %>% 
    group_by(speaker) %>% 
    filter(min_time == min(min_time)) %>% 
    ungroup()
  
  fig <- add_lines(fig,
                   x = c(df$min_time[i], df$max_time[i]),  # x0, x1
                   y = c(df$speaker[i], df$speaker[i]),  # y0, y1
                   name = df$speaker[i],
                   mode = "lines",
                   line = list(color = df$color[i], width = 20),
                   legendgroup = df$speaker[i],
                   showlegend = T,
                   hoverinfo = "text",
                   text = df$line[i],
                   
                   evaluate = T  # needed to avoid lazy loading
  )
}

for(i in 1:(nrow(df_plotly) - 1)){
  
  df = 
    df_plotly %>% 
    group_by(speaker) %>% 
    filter(min_time != min(min_time)) %>% 
    ungroup()
  
  fig <- add_lines(fig,
                   x = c(df$min_time[i], df$max_time[i]),  # x0, x1
                   y = c(df$speaker[i], df$speaker[i]),  # y0, y1
                   name = df$speaker[i],
                   mode = "lines",
                   line = list(color = df$color[i], width = 20),
                   legendgroup = df$speaker[i],
                   showlegend = F,
                   hoverinfo = "text",
                   text = df$line[i],
                   
                   evaluate = T  # needed to avoid lazy loading
  )
}

fig 

Thanks!

This topic was automatically closed 21 days after the last reply. New replies are no longer allowed.

If you have a query related to it or one of the replies, start a new topic and refer back with a link.