Contour maps or Contour-plots can be created using the UniformContoursRenderableSeries type.
The JavaScript Contours Chart Example can be found in the SciChart.Js Examples Suite on Github, or our live demo at demo.scichart.com
Above: The JavaScript Contours Chart example from the SciChart.js Demo.
Create a Contours Plot
SciChart's Contour series is an extremely fast, lightweight chart types for rendering two dimensional data as a contour plot. The UniformContoursRenderableSeries type should be used in conjunction with a UniformHeatmapDataSeries when you simply want to specify a Step in the X,Y direction (each cell is the same size).
To create a Javascript Contours Chart with SciChart.js, use the following code:
In the code above:
- We create an empty 2D array (number[][]) using the helper function zeroArray2D. This is filled with values in the generateData function
- A UniformHeatmapDataSeries instance is created with xStart, xStep, yStart, yStep values = 0, 1, 0, 1. This means the heatmap starts at X,Y = 0,0 and each cell is 1 on the axis.
- We set the contour Stroke and StrokeThickness.
- A UniformContoursRenderableSeries instance is created and added to the sciChartSurface.renderableSeries collection.
This results in the following output:
<div id="scichart-root" ></div>
body { margin: 0; } #scichart-root { width: 100%; height: 100vh; }
// This function generates data for the heatmap series example function generateExampleData(index, heatmapWidth, heatmapHeight, colorPaletteMax) { const { zeroArray2D } = SciChart; // or, import { zeroArray2D } from "SciChart"; const zValues = zeroArray2D([heatmapHeight, heatmapWidth]); const angle = (Math.PI * 2 * index) / 30; let smallValue = 0; for (let x = 0; x < heatmapWidth; x++) { for (let y = 0; y < heatmapHeight; y++) { const v = (1 + Math.sin(x * 0.04 + angle)) * 50 + (1 + Math.sin(y * 0.1 + angle)) * 50 * (1 + Math.sin(angle * 2)); const cx = heatmapWidth / 2; const cy = heatmapHeight / 2; const r = Math.sqrt((x - cx) * (x - cx) + (y - cy) * (y - cy)); const exp = Math.max(0, 1 - r * 0.008); const zValue = v * exp; zValues[y][x] = zValue > colorPaletteMax ? colorPaletteMax : zValue; zValues[y][x] += smallValue; } smallValue += 0.001; } return zValues; } async function simpleContoursChart(divElementId) { // #region ExampleA // Demonstrates how to create a contour plot with SciChart.js const { SciChartSurface, NumericAxis, HeatmapColorMap, UniformHeatmapDataSeries, UniformHeatmapRenderableSeries, UniformContoursRenderableSeries, SciChartJsNavyTheme } = SciChart; // or, for npm, import { SciChartSurface, ... } from "scichart" // Create a SciChartSurface with X & Y Axis const { wasmContext, sciChartSurface } = await SciChartSurface.create(divElementId, { theme: new SciChartJsNavyTheme() }); sciChartSurface.xAxes.add(new NumericAxis(wasmContext)); sciChartSurface.yAxes.add(new NumericAxis(wasmContext)); const WIDTH = 300; const HEIGHT = 200; const colorPaletteMax = 200; // Create a Heatmap Data-series. zValues are heatValues as a 2D Array (number[][]) // Open the Codepen below to see the definition of this function const zValues = generateExampleData(3, WIDTH, HEIGHT, colorPaletteMax); // Create the uniform heatmap data series. Pass heatValues as number[][] const heatmapDataSeries = new UniformHeatmapDataSeries(wasmContext, { // 2d zValues array. Dimensions [height][width] zValues, // xStart, xStep, yStart, yStep defines the x,y position xStart: 0, xStep: 1, yStart: 0, yStep: 1, }); // Create a Contours RenderableSeries with the same data const contourSeries = new UniformContoursRenderableSeries(wasmContext, { dataSeries: heatmapDataSeries, zMin: 20, zMax: colorPaletteMax, zStep: 20, }); // Add it to the scichartsurface sciChartSurface.renderableSeries.add(contourSeries); // Create a background heatmap series with the same data and add to the chart const heatmapSeries = new UniformHeatmapRenderableSeries(wasmContext, { dataSeries: heatmapDataSeries, opacity: 0.5, useLinearTextureFiltering: false, // See heatmap documentation for description of how colormaps work colorMap: new HeatmapColorMap({ minimum: 0, maximum: colorPaletteMax, gradientStops: [ { offset: 1, color: "#EC0F6C" }, { offset: 0.9, color: "#F48420" }, { offset: 0.7, color: "#DC7969" }, { offset: 0.5, color: "#67BDAF" }, { offset: 0.3, color: "#50C7E0" }, { offset: 0.2, color: "#264B93" }, { offset: 0, color: "#14233C" } ] }), }); // Add to the SciChartSurface sciChartSurface.renderableSeries.add(heatmapSeries); // ... // #endregion // Add zooming, panning for the example const { ZoomPanModifier, ZoomExtentsModifier, MouseWheelZoomModifier } = SciChart; sciChartSurface.chartModifiers.add(new ZoomPanModifier(), new ZoomExtentsModifier(), new MouseWheelZoomModifier()); }; simpleContoursChart("scichart-root"); async function builderExample(divElementId) { // #region ExampleB // Demonstrates how to create a line chart with SciChart.js using the Builder API const { chartBuilder, ESeriesType, HeatmapColorMap, EThemeProviderType } = SciChart; // or, for npm, import { chartBuilder, ... } from "scichart" const WIDTH = 300; const HEIGHT = 200; const colorPaletteMax = 200; // Create a Heatmap Data-series. zValues are heatValues as a 2D Array (number[][]) // Open the Codepen below to see the definition of this function const zValues = generateExampleData(3, WIDTH, HEIGHT, colorPaletteMax); const colorMap = new HeatmapColorMap({ minimum: 0, maximum: colorPaletteMax, gradientStops: [ { offset: 1, color: "#EC0F6C" }, { offset: 0.9, color: "#F48420" }, { offset: 0.7, color: "#DC7969" }, { offset: 0.5, color: "#67BDAF" }, { offset: 0.3, color: "#50C7E0" }, { offset: 0.2, color: "#264B93" }, { offset: 0, color: "#14233C" } ] }); const { wasmContext, sciChartSurface } = await chartBuilder.build2DChart(divElementId, { surface: { theme: { type: EThemeProviderType.Dark } }, series: [ { type: ESeriesType.UniformContoursSeries, options: { zMin: 20, zMax: colorPaletteMax, zStep: 20 }, heatmapData: { zValues, xStart: 0, xStep: 1, yStart: 0, yStep: 1 } }, { type: ESeriesType.UniformHeatmapSeries, options: { colorMap, opacity: 0.5 }, heatmapData: { zValues, xStart: 0, xStep: 1, yStart: 0, yStep: 1 } } ] }); // #endregion }; // Uncomment this to use the builder example //builderExample("scichart-root");
Updating Data in a Contour map
The contour map is supposed to be fully dynamic, enabling real-time graphics. The Contours Series however does not support append, insert, update, remove functions like other DataSeries do. You can however update the data and force a refresh simply by updating the data passed in. To do this, use the following code:
Example Title |
Copy Code
|
---|---|
import { UniformHeatmapDataSeries, zeroArray2D } from "scichart"; // Create an empty 2D array of size height & width const initialZValues: number[][] = zeroArray2D([height, width]); // Create a Heatmap Data-series. Pass the heatValues as a number[][] to the UniformHeatmapDataSeries const heatmapDataSeries = new UniformHeatmapDataSeries(wasmContext, 0, 1, 0, 1, initialZValues); // ... // Later, update the data initialZValues[5][6] = 123.4; // Tell SciChart the data has changed heatmapDataSeries.notifyDataChanged() // You can also load an entirely new array with the function UniformHeatmapDataSeries.setZValues const newZValues; // type number[][] heatmapDataSeries.setZValues(newZValues); |