plotly / plotly/plotly.R

Selective scatter hover disturbed for unequal marker sizes

Open
#2,059 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

Hi -

I would like to create a scatter plot in which the hover tooltip is shown for a small number of highlighted points and hidden for the majority of 'base' points. This works well if the markers for the 'highlight' and 'base' points are the same size, but it is very hard to get the hover to activate if there is any difference between the 2 trace's marker sizes. I have created an illustration for this below - apologies the code is quite long, but hopefully it makes it easy to understand the problem I'm describing.

Is there a way to avoid the 'base' trace interfering with the hover for the 'highlight' trace whilst having different sized markers for the two traces?

library(plotly)
library(dplyr)

# Create 'base' points data - hover not to be shown
n <- 1e4
baseData <- tibble(
  x = rnorm(n),
  y = 2*x + rnorm(n, sd = 5),
  type = "Base")

# Create 'highlight' points data - hover to be shown
### Add a point in bottom right quadrant that won't overlap with base points
highlightData <- tibble(
  x = c(rnorm(10), 3.5),
  y = c((2*x[1:10] + rnorm(10, sd = 5)), -18),
  type = "Highlight")

# Create plots with equal and unequal sized markers
plots <- lapply(
  c(20, 19), # Define base points size for each plot 
  function(baseSize) {
    # Show legend for first plot only
    showLeg <- ifelse(baseSize == 20, TRUE, FALSE)
    
    plot_ly(colors = c("#66C2A5", "#FC8D62")) %>% 
      # Create trace with no hover for base data
      add_trace(
        data = baseData,
        x = ~x, y = ~y, color = ~type,
        legendgroup = ~type, showlegend = showLeg,
        alpha  = 0.1, 
        type = "scatter", mode = 'markers',
        hoverinfo = "skip",
        marker = list(size = baseSize)) %>%
      # Create trace WITH hover for highlight data
      add_trace(
        data = highlightData,
        x = ~x, y = ~y, color = ~type,
        legendgroup = ~type, showlegend = showLeg,
        type = "scatter", mode = 'markers', 
        hoverinfo = "all",
        marker = list(
          size = 20,
          color = 'rgba(255, 182, 193, .9)',
          line = list(color = 'rgba(152, 0, 0, .8)',
                      width = 2)))
  })

# Create & append subplot titles
# Update title
annotations = list( 
  list( 
    x = 0.2,  y = 1.0,  
    text = "Equal Sized Markers - Easy Hover...",  
    xref = "paper",  yref = "paper",  
    xanchor = "center", yanchor = "bottom", showarrow = FALSE),  
  list( 
    x = 0.8, y = 1,  
    text = "Unequal Sizes - Hover only easy in bottom right point...",  
    xref = "paper", yref = "paper",  
    xanchor = "center", yanchor = "bottom", showarrow = FALSE))

subplot(plots[[1]], plots[[2]]) %>%
  layout(annotations = annotations) 

Thank you for your help and (as always) for this fantastic package!

Ben

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 by running the supplied R reproduction and compare the equal-sized and unequal-sized marker plots. Investigate how the base and highlight scatter traces compete during hover, then confirm that highlighted points remain easy to hover while base-point hover stays suppressed with different marker sizes.

Written by the indexing model from the issue text.

Assessment

Tech stack
plotly, r
Domain
data-visualization
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.