Per-Point Colouring of Band Segments
Colour Band Series Segments with PaletteProvider
Let's create a FastBandRenderableSeries.
const { wasmContext, sciChartSurface } = await SciChartSurface.create(divElementId, { theme: new SciChartJSLightTheme() }); sciChartSurface.xAxes.add(new NumericAxis(wasmContext)); sciChartSurface.yAxes.add(new NumericAxis(wasmContext, { growBy: new NumberRange(0.4, 0.4) })); const dataSeries = new XyyDataSeries(wasmContext); const POINTS = 20; const STEP = (3 * Math.PI) / POINTS; for (let i = 0; i <= POINTS; i++) { const k = 1 - i / 2000; const y = Math.sin(i * STEP) * k * 0.7; const y1 = Math.cos(i * STEP) * k; dataSeries.append(i, y, y1); } const rendSeries = new FastBandRenderableSeries(wasmContext, { dataSeries, strokeThickness: 7, fill: 'rgba(39,155,39,0.7)', fillY1: 'rgba(255,25,25,0.7)', stroke: '#FF1919', strokeY1: '#279B27', opacity: 1, pointMarker: new EllipsePointMarker(wasmContext, { width: 14, height: 14, strokeThickness: 4, stroke: '#FFFF33', fill: '#33FF33', opacity: 1 }), }); sciChartSurface.renderableSeries.add(rendSeries); sciChartSurface.zoomExtents();
Next we create a BandPaletteProvider by implementing IStrokePaletteProvider, IFillPaletteProvider and IPointMarkerPaletteProvider interfaces in typescript, or extending DefaultPaletteProvider in JavaScript.
// PaletteProvider implementation which colours stroke, fill and pointmarker class BandPaletteProvider extends DefaultPaletteProvider { constructor() { super(); this.strokePaletteMode = EStrokePaletteMode.SOLID; this.fillPaletteMode = EFillPaletteMode.SOLID; this.limeStroke = parseColorToUIntArgb('lime'); this.yellowFill = parseColorToUIntArgb('rgba(255,255,0,0.7)'); this.markerRedStroke = parseColorToUIntArgb('red'); this.markerBlueFill = parseColorToUIntArgb('blue'); } overrideFillArgb( xValue, yValue, index, opacity, metadata ) { if (xValue >= 6 && xValue <= 12) { return opacity !== undefined ? uintArgbColorMultiplyOpacity(this.yellowFill, opacity) : this.yellowFill; } return undefined; } overrideStrokeArgb( xValue, yValue, index, opacity, metadata ) { if (xValue >= 6 && xValue <= 12) { return opacity !== undefined ? uintArgbColorMultiplyOpacity(this.limeStroke, opacity) : this.limeStroke; } return undefined; } overridePointMarkerArgb( xValue, yValue, index, opacity, metadata ) { if (xValue >= 6 && xValue <= 12) return { stroke: this.markerRedStroke, fill: this.markerBlueFill }; return undefined; } }
// PaletteProvider implementation which colours stroke, fill and pointmarker class BandPaletteProvider implements IStrokePaletteProvider, IFillPaletteProvider, IPointMarkerPaletteProvider { public readonly strokePaletteMode = EStrokePaletteMode.SOLID; public readonly fillPaletteMode = EFillPaletteMode.SOLID; private readonly limeStroke = parseColorToUIntArgb('lime'); private readonly yellowFill = parseColorToUIntArgb('rgba(255,255,0,0.7)'); private readonly markerRedStroke = parseColorToUIntArgb('red'); private readonly markerBlueFill = parseColorToUIntArgb('blue'); public onAttached(parentSeries: IRenderableSeries): void {} public onDetached(): void {} public overrideFillArgb( xValue: number, yValue: number, index: number, opacity?: number, metadata?: IPointMetadata ): number { if (xValue >= 6 && xValue <= 12) { return opacity !== undefined ? uintArgbColorMultiplyOpacity(this.yellowFill, opacity) : this.yellowFill; } return undefined; } public overrideStrokeArgb( xValue: number, yValue: number, index: number, opacity?: number, metadata?: IPointMetadata ): number { if (xValue >= 6 && xValue <= 12) { return opacity !== undefined ? uintArgbColorMultiplyOpacity(this.limeStroke, opacity) : this.limeStroke; } return undefined; } public overridePointMarkerArgb( xValue: number, yValue: number, index: number, opacity?: number, metadata?: IPointMetadata ): TPointMarkerArgb { if (xValue >= 6 && xValue <= 12) return { stroke: this.markerRedStroke, fill: this.markerBlueFill }; return undefined; } }
To use it, apply to the Paletteprovider property on a RenderableSeries:
// Usage const bandSeries = new FastBandRenderableSeries(wasmContext); bandSeries.paletteProvider = new BandPaletteProvider();
Now we have a paletted band renderable series with fill, stroke and point markers overridden for X in range from 6 to 12.