alex-poor opened a new issue, #40786:
URL: https://github.com/apache/superset/issues/40786

   ### Bug description
   
   The deck.gl **Polygon** chart legend renders bucket labels with **shared 
endpoints**, so consecutive bins appear to overlap. With default settings (no 
manual break points), the legend shows e.g.:
   
   ```
   1 - 81
   81 - 212
   212 - 369
   ```
   
   Every interior breakpoint (`81`, `212`, …) appears in **two** adjacent 
labels — once as an upper bound, once as a lower bound — which reads as 
overlapping ranges and is confusing.
   
   **This is a cosmetic / UX-clarity issue, not a correctness bug.** The 
underlying binning and coloring are correct: colors are assigned with d3's 
`scaleThreshold`, which treats each breakpoint as a half-open cut point, so a 
value of exactly `81` lands in exactly one bucket (`81–212`). No polygon is 
double-counted or mis-colored. Only the legend *label text* is ambiguous.
   
   ### Root cause
   
   In `superset-frontend/plugins/preset-chart-deckgl/src/utils.ts`, 
`getBuckets()` builds each label by pairing adjacent breakpoints:
   
   ```js
   const range = `${breakPoints[i]} - ${breakPoints[i + 1]}`;
   ```
   
   This always reuses each interior breakpoint in two labels. The color scale 
(`getBreakPointColorScaler`, same file) uses `scaleThreshold`, which is 
half-open and unambiguous — so the labels misrepresent the (correct) bucketing 
logic.
   
   ### Scope
   
   - Affects the deck.gl **Polygon** layer only — it is the only chart in the 
frontend that renders a **discrete numeric-range legend** (`scaleThreshold` 
appears nowhere else in `superset-frontend`).
   - Country Map / World Map avoid this by using a **continuous linear color 
scale** with no discrete-range legend.
   - ECharts charts use **categorical** legends (names, not ranges), so they 
are unaffected.
   - Independent of the `Number of buckets` vs `Bucket break points` controls — 
setting explicit break points changes *where* the bins are, but labels still 
share endpoints.
   
   ### Expected behavior
   
   Legend bins should read as a clean, non-overlapping partition. There is no 
existing internal convention to match (Polygon is the only discrete-range 
legend), so candidate formats:
   
   1. **Edge-operator notation** (common GIS/choropleth convention — ArcGIS, 
Datawrapper): `< 81`, `81 – 212`, `212 – 369`, `> 369`
   2. **Interval notation:** `[1, 81)`, `[81, 212)`, `[212, 369]`
   3. **Render the boundary number once between touching swatches** 
(gradient-bar style) rather than as isolated `a - b` rows.
   
   > Note: simply incrementing the lower bound (`82 - 212`) is *not* correct in 
general — breakpoints and metric values can be fractional, so a value like 
`81.5` would fall into a labeling gap.
   
   ### How to reproduce
   
   1. Create a deck.gl **Polygon** chart with a numeric metric.
   2. Leave **Bucket break points** empty (use default **Number of buckets**).
   3. Observe the legend — adjacent bins share endpoints (`1 - 81`, `81 - 212`, 
…).
   
   ### Superset version
   
   master / latest (also observed on 5.0+).
   
   ### Related (different) issues
   
   - #34747 — legend *limits* miscalculated (rounding the max bound); a 
separate, already-fixed bug.
   - #7264, #35142 — other deck.gl legend fixes; none address label formatting.
   
   No existing open issue/PR covers the shared-endpoint label formatting.
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to