From efa8e66f355d77ab2baa309c91e5573e0c04bfa4 Mon Sep 17 00:00:00 2001 From: Fayaz Bin Salam Date: Sun, 20 Sep 2026 12:45:46 +0400 Subject: [PATCH 1/2] fix(series): treat NaN as an undefined point in pointDefined --- packages/solid-charts/src/lib/utils.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/solid-charts/src/lib/utils.ts b/packages/solid-charts/src/lib/utils.ts index f3580ba..4c2fb6b 100644 --- a/packages/solid-charts/src/lib/utils.ts +++ b/packages/solid-charts/src/lib/utils.ts @@ -36,7 +36,9 @@ const getBarPadding = (chartContext: ChartContextType) => { return bandScale.bandwidth() / 2 } +// NaN is `typeof 'number'`, so a missing/invalid value used to pass this check +// and land in the generated path as `M x,NaN`. Check for finiteness instead. const pointDefined = (point: [number, number]) => - typeof point[0] === 'number' && typeof point[1] === 'number' + Number.isFinite(point[0]) && Number.isFinite(point[1]) export { accessData, gapToPadding, getBarPadding, pointDefined } From 7519010ef706e9a5173c327191f2edb66aec43d2 Mon Sep 17 00:00:00 2001 From: Fayaz Bin Salam Date: Sun, 20 Sep 2026 12:45:47 +0400 Subject: [PATCH 2/2] fix(series): ignore non-finite values when computing the axis domain --- packages/solid-charts/src/lib/createSeries.ts | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/packages/solid-charts/src/lib/createSeries.ts b/packages/solid-charts/src/lib/createSeries.ts index 0ddb710..1ec2714 100644 --- a/packages/solid-charts/src/lib/createSeries.ts +++ b/packages/solid-charts/src/lib/createSeries.ts @@ -38,7 +38,17 @@ const createSeries = (props: { const stackValues = stack ? [...stack.values()].flatMap((stack) => stack.values) : [] - const min = Math.min(...data, ...stackValues) + // A series with holes (missing dataKey on some entries) yields undefined/NaN. + // Math.min/max over those returns NaN, which poisons the axis domain and makes + // every point on the axis NaN - not just the missing one. + const finiteData = data.filter((value) => Number.isFinite(value)) + const finiteStackValues = stackValues.filter((value) => + Number.isFinite(value), + ) + const min = + finiteData.length + finiteStackValues.length > 0 + ? Math.min(...finiteData, ...finiteStackValues) + : 0 let max: number | null = null if (stack) { @@ -48,13 +58,14 @@ const createSeries = (props: { let stackedValue = 0 for (const stackDataKey of stackDataKeys) { - stackedValue += stack.get(stackDataKey)?.values[dataIdx] ?? 0 + const value = stack.get(stackDataKey)?.values[dataIdx] + stackedValue += Number.isFinite(value) ? (value as number) : 0 } max = Math.max(max ?? stackedValue, stackedValue) } } - max = max ?? Math.max(...data) + max = max ?? (finiteData.length > 0 ? Math.max(...finiteData) : 0) props.chartContext.registerAxis(props.axisId(), { type: 'series',