Demonstrates the Numeric, Category, Date and Logarithmic axis types available SciChart.js, High Performance JavaScript Charts
drawExample.ts
index.tsx
TBinanceCandleData.ts
theme.ts
1import {
2 CategoryAxis,
3 DateTimeNumericAxis,
4 EFillPaletteMode,
5 EStrokePaletteMode,
6 EAutoRange,
7 EAxisAlignment,
8 ELabelAlignment,
9 ENumericFormat,
10 FastColumnRenderableSeries,
11 FastLineRenderableSeries,
12 IFillPaletteProvider,
13 IStrokePaletteProvider,
14 IPointMetadata,
15 IRenderableSeries,
16 LogarithmicAxis,
17 MouseWheelZoomModifier,
18 NumericAxis,
19 NumberRange,
20 parseColorToUIntArgb,
21 SciChartSurface,
22 TextLabelProvider,
23 Thickness,
24 XyDataSeries,
25 ZoomExtentsModifier,
26 ZoomPanModifier,
27} from "scichart";
28
29import { appTheme } from "../../../theme";
30import { TBinanceCandleData } from "../../../TBinanceCandleData";
31
32const colorStrings = [
33 appTheme.VividSkyBlue,
34 appTheme.VividPink,
35 appTheme.MutedTeal,
36 appTheme.VividOrange,
37 appTheme.VividBlue,
38];
39const colors = colorStrings.map((c) => parseColorToUIntArgb(c + "AA"));
40
41export const drawExample = async (rootElement: string | HTMLDivElement) => {
42 // Create a SciChartSurface with Theme
43 const { sciChartSurface, wasmContext } = await SciChartSurface.create(rootElement, {
44 theme: appTheme.SciChartJsTheme,
45 });
46 const labelProvider = new TextLabelProvider({
47 labels: ["Bitcoin", "Ethereum", "XRP", "Cardano", "Dogecoin"],
48 });
49 // Category Axis - measures using index not value.
50 const xAxis = new CategoryAxis(wasmContext, { id: "XCategory", labelProvider });
51
52 xAxis.labelStyle.fontSize = 18;
53 xAxis.labelStyle.alignment = ELabelAlignment.Center;
54 xAxis.labelStyle.padding = new Thickness(2, 1, 2, 1);
55 // Allow rotated labels to overlap
56 xAxis.axisRenderer.hideOverlappingLabels = false;
57 // Keep first and last labels aligned to their ticks
58 xAxis.axisRenderer.keepLabelsWithinAxis = false;
59 xAxis.axisTitle = ["Top 5 Coins - Category Axis", "Custom labels using TextLabelProvider"];
60 xAxis.axisTitleStyle.fontSize = 14;
61
62 sciChartSurface.xAxes.add(xAxis);
63
64 // Numeric Y-Axis. measures using value
65 const yAxis = new NumericAxis(wasmContext, {
66 id: "YNumeric",
67 autoRange: EAutoRange.Always,
68 labelPrefix: "$",
69 labelPostfix: "B",
70 labelPrecision: 0,
71 axisAlignment: EAxisAlignment.Left,
72 labelStyle: { fontSize: 14 },
73 });
74 // Pass array to axisTitle to make it multiline
75 yAxis.axisTitle = ["Market Cap - Numeric Axis", "formatting using prefix and postfix"];
76 yAxis.axisTitleStyle.fontSize = 14;
77
78 sciChartSurface.yAxes.add(yAxis);
79
80 const columnSeries = new FastColumnRenderableSeries(wasmContext, {
81 strokeThickness: 0,
82 dataPointWidth: 0.5,
83 paletteProvider: new AxisTypesPaletteProvider(),
84 xAxisId: xAxis.id,
85 yAxisId: yAxis.id,
86 });
87 sciChartSurface.renderableSeries.add(columnSeries);
88
89 const dataSeries = new XyDataSeries(wasmContext);
90 dataSeries.appendRange([0, 1, 2, 3, 4], [380.9, 162.1, 23.87, 14.56, 8.372]);
91 columnSeries.dataSeries = dataSeries;
92 const endDate = new Date(2022, 10, 5);
93 const startTime = endDate.getTime() / 1000 - 500 * 7 * 24 * 60 * 60;
94 const dateXAxis = new DateTimeNumericAxis(wasmContext, {
95 axisAlignment: EAxisAlignment.Top,
96 id: "XDate",
97 labelStyle: { fontSize: 18 },
98 axisTitle: ["Date Axis", "Auto formats based on the date range"],
99 axisTitleStyle: { fontSize: 18 },
100 visibleRangeLimit: new NumberRange(startTime, endDate.getTime() / 1000),
101 });
102 sciChartSurface.xAxes.add(dateXAxis);
103
104 // Logarithmic Y Axis - measures on log scale using value
105 const logYAxis = new LogarithmicAxis(wasmContext, {
106 id: "YLog",
107 logBase: 2,
108 labelFormat: ENumericFormat.SignificantFigures,
109 labelPrefix: "$",
110 axisAlignment: EAxisAlignment.Right,
111 labelStyle: { fontSize: 14 },
112 axisTitle: ["Price - Logarithmic Axis", "base 2, labelFormat: SignificantFigures"],
113 axisTitleStyle: { fontSize: 14 },
114 });
115 sciChartSurface.yAxes.add(logYAxis);
116
117 const symbols = ["BTCUSDT", "ETHUSDT", "XRPUSDT", "ADAUSDT", "DOGEUSDT"];
118 for (let index = 0; index < symbols.length; index++) {
119 const symbol = symbols[index];
120 const priceDataSeries = new XyDataSeries(wasmContext, { dataSeriesName: symbol });
121 const series = new FastLineRenderableSeries(wasmContext, {
122 id: symbol,
123 strokeThickness: 3,
124 xAxisId: dateXAxis.id,
125 yAxisId: logYAxis.id,
126 stroke: colorStrings[index],
127 dataSeries: priceDataSeries,
128 });
129 sciChartSurface.renderableSeries.add(series);
130
131 (async () => {
132 const response = await fetch(
133 `api/get-binance-candles?interval=1w&symbol=${symbol}&limit=500&endTime=${endDate}`
134 );
135 const data: TBinanceCandleData = await response.json();
136 priceDataSeries.appendRange(data.xValues, data.closeValues);
137 sciChartSurface.zoomExtents();
138 })();
139 }
140
141 sciChartSurface.chartModifiers.add(
142 new ZoomPanModifier({ includedXAxisIds: [dateXAxis.id], includedYAxisIds: [logYAxis.id] }),
143 new MouseWheelZoomModifier({ includedXAxisIds: [dateXAxis.id], includedYAxisIds: [logYAxis.id] }),
144 new ZoomExtentsModifier()
145 );
146
147 return { sciChartSurface, wasmContext };
148};
149
150class AxisTypesPaletteProvider implements IStrokePaletteProvider, IFillPaletteProvider {
151 public readonly strokePaletteMode = EStrokePaletteMode.SOLID;
152 public readonly fillPaletteMode = EFillPaletteMode.SOLID;
153
154 // tslint:disable-next-line:no-empty
155 public onAttached(parentSeries: IRenderableSeries): void {}
156
157 // tslint:disable-next-line:no-empty
158 public onDetached(): void {}
159
160 public overrideFillArgb(xValue: number, yValue: number, index: number): number {
161 return colors[xValue];
162 }
163
164 public overrideStrokeArgb(
165 xValue: number,
166 yValue: number,
167 index: number,
168 opacity?: number,
169 metadata?: IPointMetadata
170 ): number {
171 return undefined;
172 }
173}
174This example demonstrates the integration of SciChart.js within a React application using the <SciChartReact/> component. It showcases multiple axis types including CategoryAxis, NumericAxis, DateTimeNumericAxis and LogarithmicAxis. Custom axis labeling is implemented using the TextLabelProvider to display arbitrary string text labels, and a custom palette provider (AxisTypesPaletteProvider) is used for dynamic coloring of columns.
The chart is initialized in a React component via the <SciChartReact/> element, which encapsulates the setup within React lifecycle methods. All axis types are instantiated directly and configured with specific properties such as custom font sizes, alignments, and prefixes/postfixes for labels. Developers can refer to the SciChart.js Axis Documentation for a detailed explanation on the various axis types. Custom axis labeling is achieved through the TextLabelProvider as explained in the Axis LabelProviders Documentation. Additionally, the example utilizes a custom palette provider by extending IStrokePaletteProvider and IFillPaletteProvider for dynamic series styling.
The example includes several advanced features and capabilities such as real-time data updates that fetch and render data asynchronously, interactive chart behaviors with zoom, pan and mouse wheel actions, and multi-axis configurations that allow parallel display of datasets with different scales. Real-time updates are managed in a React-friendly way, consolidating state management with SciChart.js’s high-performance WebGL rendering, ensuring smooth updates even with large datasets, as detailed in the Adding Realtime Updates guide.
The integration with React follows best practices by utilizing the <SciChartReact/> component which ensures proper initialization and cleanup through React’s lifecycle, as discussed in Creating a SciChart React Component from the Ground Up. Furthermore, the example employs performance optimization techniques by leveraging WebGL rendering capabilities, as outlined in the Performance Tips & Tricks documentation. Developers building production-grade charting solutions in React can benefit from the modular design of this example which promotes reusability and efficient resource management, making it easier to integrate complex chart configurations within larger applications. For further insights into the integration of SciChart.js with React, check out React Charts with SciChart.js: Introducing “SciChart React”.

Demonstrates Multiple X & Y Axis on a React Chart using SciChart.js. SciChart supports unlimited left, right, top, bottom X, Y axis with configurable alignment and individual zooming, panning

Demonstrates Secondary Y Axis on a React Chart using SciChart.js. SciChart supports unlimited, multiple left, right, top, bottom X, Y axis with configurable alignment and individual zooming, panning

Demonstrates alignment of Axis to create a vertical chart with SciChart.js - JavaScript Charts.

Demonstrates Central Axes on a React Chart using SciChart.js. SciChart supports unlimited left, right, top, bottom X, Y axis with configurable layout

Demonstrates isStaticAxis on a React Chart using SciChart.js.

Demonstrates Vertically Stacked Axes on a React Chart using SciChart.js, allowing data to overlap

Demonstrates Logarithmic Axis on a React Chart using SciChart.js. SciChart supports logarithmic axis with scientific or engineering notation and positive and negative values


Demonstrates BaseValue Axes on a React Chart using SciChart.js to create non-linear and custom-scaled axes

Demonstrates the option of the transparent Axes customization on a React Chart using SciChart.js.

Demonstrates outer, inner, central and stacked axes, and use of axis alignment to create vertical charts