Skip to content

[Bug] Regression in 6.x: dataZoom slider showDataShadow renders nothing when the shadow-source series has a single data point on a time axis (NaN from zero-width extent) #21649

@JBorgia

Description

@JBorgia
Image

Version

Affected: 6.0.0 and 6.1.0 (latest). Regression — works in 5.x (tested 5.3.2 and 5.6.0). Introduced in 6.0.0 (the time-axis dataShadow positioning; first present in 6.0.0-beta.1).

Link to Minimal Reproduction

Here is the example

Steps to Reproduce

  1. xAxis: { type: 'time' }, dataZoom: [{ type: 'slider', showDataShadow: true }].
  2. Give the shadow-source series a SINGLE data point.
  3. The slider shadow is empty/missing.

Minimal option (the slider shadow vanishes on 6.x; renders on 5.x):

option = {
xAxis: { type: 'time' },
yAxis: { type: 'value' },
dataZoom: [{ type: 'slider', showDataShadow: true }],
series: [{ type: 'line', data: [['2025-07-01', 285]] }]
};

Real-world variant: with multiple series, the first eligible series is
chosen as the shadow source, so a single-point first series breaks the
shadow even when later series are dense.

Current Behavior

In SliderZoomView._renderDataShadow (6.x), the time-axis branch computes:

normalizationConstant = size[0] / (thisDataExtent[1] - thisDataExtent[0]);
thisCoord = isTimeAxis ? (value - thisDataExtent[0]) * normalizationConstant : thisCoord + step;

For a single-point series the x-extent has zero width, so
normalizationConstant = Infinity and thisCoord = 0 * Infinity = NaN. The
shadow polygon receives a NaN vertex and does not render.

Measured shadow polygon on 6.1.0: points [[size,0],[0,0],[NaN,15]] (hasNaN=true).
On 5.3.2/5.6.0 the same option yields finite, step-based points (hasNaN=false).

Note the adjacent step path WAS guarded against divide-by-zero
(Math.max(1, data.count() - 1)); the new time-axis division was not.

Expected Behavior

A single-point (zero-width-extent) shadow source should render the same way
it did in 5.x (no NaN), or fall back gracefully — not erase the shadow.

Fix: guard the time-axis normalization when (thisDataExtent[1] -
thisDataExtent[0]) === 0 (e.g. fall back to the step-based coordinate or
clamp to 0), mirroring the existing Math.max guard on step.

Happy to PR this.

Environment

- OS: macOS 15
- Browser: Chrome 126
- Framework: Angular

Any additional comments?

This is distinct from the timeline component — the issue is specifically
in the dataZoom-slider shadow source-series selection.

The slider's data shadow is empty on 6.x. Switch the CDN to echarts/5.6.0 and the shadow appears — same option.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugenThis issue is in EnglishpendingWe are not sure about whether this is a bug/new feature.

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions