Skip to content

[BUG]: scatterpolargl drops points between 10000 and 100000 points #8148

Open

Description

@camdecoster

Description

scatterpolargl does not set opts.marker.snap as scattergl does. This limits how many markers are displayed at certain zoom levels due to how regl-scatter2d handles rendering with its default snap value (10000). See #4323.

Screenshots

scatterpolargl vs. scattergl with the same data:

Image

Steps to reproduce

  • Open Plotly devtools and paste the following into the browser devtools console:
const n = 90000;
const gauss = () => (Math.random() + Math.random() + Math.random() + Math.random() - 2) / 2;

const x = [];
const y = [];
const r = [];
const theta = [];
for (let i = 0; i < n; i++) {
    const px = 0.05 * gauss();
    const py = 0.05 * gauss();
    x.push(px);
    y.push(py);
    r.push(Math.hypot(px, py));
    theta.push(Math.atan2(py, px) * 180 / Math.PI);
}

const marker = {color: 'rgba(0,0,255,0.01)', size: 3};

Plotly.newPlot(gd, [
    {type: 'scatterpolargl', mode: 'markers', r, theta, marker, subplot: 'polar'},
    {type: 'scattergl', mode: 'markers', x, y, marker, xaxis: 'x', yaxis: 'y'}
], {
    width: 760,
    height: 420,
    showlegend: false,
    polar: {domain: {x: [0, 0.45]}},
    xaxis: {domain: [0.58, 1], anchor: 'y'},
    yaxis: {domain: [0.1, 0.9], anchor: 'x', scaleanchor: 'x'}
});
  • Note that the scatterpolargl plot is pale compared to scattergl

Notes

  • For a scatterpolargl trace with more than 10000 points, regl-scatter2d builds its own cluster tree. It then draws only the level-of-detail subset of points. The same data on scattergl draws every point.
  • scattergl had this bug but it got fixed in Fix scattergl mising points plot and react #4323
  • The same fix can be applied to this trace: set opts.marker.snap = len after convert.style in src/traces/scatterpolargl/calc.js

Activity

  1. Tanishdete333 commented on Oct 30, 2026

    @Tanishdete333

    Hi @camdecoster, Tanish here, I’d like to work on this. I reproduced it on current main: with 30,000 points of identical data, scatterpolargl renders visibly paler than scattergl, while at 5,000 points they look alike. From reading the code, scatterpolargl/calc.js never sets opts.marker.snap (scattergl/calc.js does, from #4323), so regl-scatter2d’s default of 10000 applies. My plan is to set it in calc.js, add a jasmine test, and check what happens above 100k points, where plot.js passes a cluster tree. Is anyone already working on this, or is there anything you’d like handled differently?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions