It is possible to have null points or gaps in multiple series types by passing a data point with Y = NaN (Not a Number). The following chart (series) types support NaN gaps.
- Line Series - with gaps or closed-lines where NaN is found
- Scatter Series
- Mountain Series - with gaps or closed-lines
- Column Series
- Candlestick/Ohlc Series
- Bubble Series
Drawing Null points with NaN
The following example shows you how to draw null points by setting Y=NaN.
Setting Y=NaN is considered a 'null point' in SciChart.js and will allow you to hide areas of the data.
Note Line-based series such as Line, Mountain, Band and Spline may also be drawn as a closed-line when Y=NaN by setting BaseRenderableSeries.drawNaNAs = ELineDrawMode.PolyLine. This property will be ignored for certain series types like Scatter.
Here's an example below:
<div id="scichart-root" ></div>
body { margin: 0; } #scichart-root { width: 100%; height: 100vh; }
// Seeded random approximation (required for tests / data generation consistency) let randomSeed = 0; function random() { const x = Math.sin(randomSeed++) * 10000; return x - Math.floor(x); } async function drawMountainChartsWithGaps(divElementId) { // Demonstrates how to create a line chart with gaps using SciChart.js const { SciChartSurface, NumericAxis, FastMountainRenderableSeries, GradientParams, XyDataSeries, Point, SciChartJsNavyTheme, TextAnnotation, LineAnnotation, MouseWheelZoomModifier, ZoomPanModifier, ZoomExtentsModifier, EHorizontalAnchorPoint, EVerticalAnchorPoint } = SciChart; // or, for npm, import { SciChartSurface, ... } from "scichart" const { wasmContext, sciChartSurface } = await SciChartSurface.create(divElementId, { theme: new SciChartJsNavyTheme() }); sciChartSurface.xAxes.add(new NumericAxis(wasmContext)); sciChartSurface.yAxes.add(new NumericAxis(wasmContext)); // #region ExampleA // Create some data with Y=NAN gaps let yLast = 100.0; const xValues = []; const yValues = []; for (let i = 0; i <= 250; i++) { const y = yLast + (random() - 0.48); yLast = y; xValues.push(i); yValues.push(i % 50 < 15 ? NaN : y); } // Create a mountain series const mountainSeries = new FastMountainRenderableSeries(wasmContext, { dataSeries: new XyDataSeries(wasmContext, { xValues, yValues }), stroke: "#4682b4", strokeThickness: 3, zeroLineY: 0.0, // when a solid color is required, use fill fill: "rgba(176, 196, 222, 0.7)", // when a gradient is required, use fillLinearGradient fillLinearGradient: new GradientParams(new Point(0, 0), new Point(0, 1), [ { color: "rgba(70,130,180,0.77)", offset: 0 }, { color: "rgba(70,130,180,0.0)", offset: 1 }, ]), }); // #endregion sciChartSurface.renderableSeries.add(mountainSeries); // add labels sciChartSurface.annotations.add(new TextAnnotation({ x1: 75, y1: 104.1, text: "Gaps occur where Y = NaN", textColor: "LightSteelBlue", fontSize: 16, horizontalAnchorPoint: EHorizontalAnchorPoint.Right, verticalAnchorPoint: EVerticalAnchorPoint.Bottom})); sciChartSurface.annotations.add(new LineAnnotation({ x1: 70, x2: 105, y1: 104, y2: 102, stroke: "LightSteelBlue", strokeThickness: 2 })); // add interaction for demo sciChartSurface.chartModifiers.add(new MouseWheelZoomModifier(), new ZoomPanModifier, new ZoomExtentsModifier()); }; drawMountainChartsWithGaps("scichart-root"); async function builderExample(divElementId) { // Demonstrates how to create a line chart with gaps in SciChart.js using the Builder API const { chartBuilder, ESeriesType, ELineDrawMode, EThemeProviderType, EAnnotationType, EHorizontalAnchorPoint, EVerticalAnchorPoint } = SciChart; // or, for npm, import { SciChartSurface, ... } from "scichart" // #region ExampleB // Create some data with Y=NAN gaps let yLast = 100.0; const xValues = []; const yValues = []; for (let i = 0; i <= 250; i++) { const y = yLast + (random() - 0.48); yLast = y; xValues.push(i); yValues.push(i % 50 < 15 ? NaN : y); } const { wasmContext, sciChartSurface } = await chartBuilder.build2DChart(divElementId, { surface: { theme: { type: EThemeProviderType.Dark } }, series: [ { type: ESeriesType.MountainSeries, xyData: { xValues, yValues }, options: { stroke: "#4682b4", strokeThickness: 3, zeroLineY: 0.0, drawNaNAs: ELineDrawMode.DiscontinuousLine, fill: "rgba(176, 196, 222, 0.7)", // when a solid color is required, use fill fillLinearGradient: { gradientStops: [{ color:"rgba(70,130,180,0.77)",offset:0.0 },{ color: "rgba(70,130,180,0.0)", offset:1 }], startPoint: { x:0, y:0 }, endPoint: { x:0, y:1} } } } ], annotations: [ { type: EAnnotationType.SVGTextAnnotation, options: { x1: 75, y1: 104.1, text: "Gaps occur where Y = NaN", textColor: "LightSteelBlue", fontSize: 16, horizontalAnchorPoint: EHorizontalAnchorPoint.Right, verticalAnchorPoint: EVerticalAnchorPoint.Bottom }}, { type: EAnnotationType.RenderContextLineAnnotation, options: { x1: 70, x2: 105, y1: 104, y2: 102, stroke: "LightSteelBlue", strokeThickness: 2 }} ] }); // #endregion }; // Uncomment this to use the builder example //builderExample("scichart-root");
Closing Lines with NaN
Lines may also be closed when Y=NaN by setting BaseRenderableSeries.drawNaNAs = ELineDrawMode.PolyLine. This property will be ignored for certain series types like Scatter.
Having Different Styles in the Same Series
Sometimes it is asked 'can we have a different line-color, or dashed line style when Y=NaN'.
Not using the above API, but a workaround can be achieved by simply using two series, e.g. with the following data.
This approach results in some nice visualisations to represent null data (or inaccurate data) like this.
<div id="scichart-root" ></div>
body { margin: 0; } #scichart-root { width: 100%; height: 100vh; }
// Seeded random approximation (required for tests / data generation consistency) let randomSeed = 0; function random() { const x = Math.sin(randomSeed++) * 10000; return x - Math.floor(x); } async function drawMountainChartsWithGaps(divElementId) { // Demonstrates how to create a line chart with gaps using SciChart.js const { SciChartSurface, NumericAxis, FastMountainRenderableSeries, GradientParams, XyDataSeries, Point, SciChartJsNavyTheme, TextAnnotation, LineAnnotation, MouseWheelZoomModifier, ZoomPanModifier, ZoomExtentsModifier, EHorizontalAnchorPoint, EVerticalAnchorPoint } = SciChart; // or, for npm, import { SciChartSurface, ... } from "scichart" const { wasmContext, sciChartSurface } = await SciChartSurface.create(divElementId, { theme: new SciChartJsNavyTheme() }); sciChartSurface.xAxes.add(new NumericAxis(wasmContext)); sciChartSurface.yAxes.add(new NumericAxis(wasmContext)); // #region ExampleA // Create some data with Y=NAN gaps let yLast = 100.0; const xValues = []; const yValues = []; const yValuesInv = []; for (let i = 0; i <= 250; i++) { const y = yLast + (random() - 0.48); yLast = y; xValues.push(i); const isThisDataNull = i % 50 < 15; yValues.push(isThisDataNull ? NaN : y); yValuesInv.push(isThisDataNull ? y : NaN); } // Create a mountain series const mountainSeries = new FastMountainRenderableSeries(wasmContext, { dataSeries: new XyDataSeries(wasmContext, { xValues, yValues }), stroke: "#4682b4", strokeThickness: 3, zeroLineY: 0.0, // when a solid color is required, use fill fill: "rgba(176, 196, 222, 0.7)", // when a gradient is required, use fillLinearGradient fillLinearGradient: new GradientParams(new Point(0, 0), new Point(0, 1), [ { color: "rgba(70,130,180,0.77)", offset: 0 }, { color: "rgba(70,130,180,0.0)", offset: 1 }, ]), }); // Create the 'alternative style' mountain series which renders yValuesInv const altStyleMountainSeries = new FastMountainRenderableSeries(wasmContext, { dataSeries: new XyDataSeries(wasmContext, { xValues, yValues: yValuesInv }), stroke: "#F4842077", strokeDashArray: [2, 2], strokeThickness: 3, zeroLineY: 0.0, // when a gradient is required, use fillLinearGradient fillLinearGradient: new GradientParams(new Point(0, 0), new Point(0, 1), [ { color: "#F4842033", offset: 0 }, { color: "#F4842000", offset: 1 }, ]), }); // #endregion sciChartSurface.renderableSeries.add(mountainSeries); sciChartSurface.renderableSeries.add(altStyleMountainSeries); // add labels sciChartSurface.annotations.add(new TextAnnotation({ x1: 75, y1: 104.1, text: "Render alternate style here", textColor: "LightSteelBlue", fontSize: 16, horizontalAnchorPoint: EHorizontalAnchorPoint.Right, verticalAnchorPoint: EVerticalAnchorPoint.Bottom})); sciChartSurface.annotations.add(new LineAnnotation({ x1: 70, x2: 105, y1: 104, y2: 102, stroke: "LightSteelBlue", strokeThickness: 2 })); // add interaction for demo sciChartSurface.chartModifiers.add(new MouseWheelZoomModifier(), new ZoomPanModifier, new ZoomExtentsModifier()); }; drawMountainChartsWithGaps("scichart-root"); async function builderExample(divElementId) { // Demonstrates how to create a line chart with gaps in SciChart.js using the Builder API const { chartBuilder, ESeriesType, ELineDrawMode, EThemeProviderType, EAnnotationType, EHorizontalAnchorPoint, EVerticalAnchorPoint } = SciChart; // or, for npm, import { SciChartSurface, ... } from "scichart" // #region ExampleB // Create some data with Y=NAN gaps let yLast = 100.0; const xValues = []; const yValues = []; for (let i = 0; i <= 250; i++) { const y = yLast + (random() - 0.48); yLast = y; xValues.push(i); yValues.push(i % 50 < 15 ? NaN : y); } const { wasmContext, sciChartSurface } = await chartBuilder.build2DChart(divElementId, { surface: { theme: { type: EThemeProviderType.Dark } }, series: [ { type: ESeriesType.MountainSeries, xyData: { xValues, yValues }, options: { stroke: "#4682b4", strokeThickness: 3, zeroLineY: 0.0, drawNaNAs: ELineDrawMode.DiscontinuousLine, fill: "rgba(176, 196, 222, 0.7)", // when a solid color is required, use fill fillLinearGradient: { gradientStops: [{ color:"rgba(70,130,180,0.77)",offset:0.0 },{ color: "rgba(70,130,180,0.0)", offset:1 }], startPoint: { x:0, y:0 }, endPoint: { x:0, y:1} } } } ], annotations: [ { type: EAnnotationType.SVGTextAnnotation, options: { x1: 75, y1: 104.1, text: "Gaps occur where Y = NaN", textColor: "LightSteelBlue", fontSize: 16, horizontalAnchorPoint: EHorizontalAnchorPoint.Right, verticalAnchorPoint: EVerticalAnchorPoint.Bottom }}, { type: EAnnotationType.RenderContextLineAnnotation, options: { x1: 70, x2: 105, y1: 104, y2: 102, stroke: "LightSteelBlue", strokeThickness: 2 }} ] }); // #endregion }; // Uncomment this to use the builder example //builderExample("scichart-root");