Background reading:
If you haven't already, read the article The CursorModifier Type which will show you how to setup a CursorModifier with default options for tooltips. This article goes into further detail on customising the tooltip items (formatting, text content)
Basic CursorModifier Tooltip Formatting Options
Tooltip and Axis Label formatting comes from the axis.labelprovider.formatCursorLabel() function and is axis-specific. You can read more about the Axis.LabelProvider API here, including how to specify formats from Enums and override formatting programmatically.
Below we're going to show you how to apply cursor formatting to enable four-decimal places on tooltips.
Here's a Codepen which shows the effect of these properties on the axis on cursor tooltips.
<div id="scichart-root" ></div>
body { margin: 0; }
#scichart-root { width: 100%; height: 100vh; }
async function formatCursorModifier(divElementId) {
const {
SciChartSurface,
NumericAxis,
FastLineRenderableSeries,
XyDataSeries,
SciChartJsNavyTheme,
ENumericFormat,
CursorModifier,
TextAnnotation,
EHorizontalAnchorPoint,
ECoordinateMode,
EllipsePointMarker
} = SciChart;
// or for npm import { SciChartSurface, ... } from "scichart"
// #region ExampleA
// Create a chart surface
const { sciChartSurface, wasmContext } = await SciChartSurface.create(divElementId, {
theme: new SciChartJsNavyTheme(),
titleStyle: { fontSize: 16 }
});
sciChartSurface.xAxes.add(new NumericAxis(wasmContext, {
// label format options applied to the X-Axis
labelPrecision: 2,
labelFormat: ENumericFormat.Decimal,
// label format options applied to cursors & tooltips
cursorLabelPrecision: 4,
cursorLabelFormat: ENumericFormat.Decimal
}));
sciChartSurface.yAxes.add(new NumericAxis(wasmContext, {
// label format options applied to the X-Axis
labelPrecision: 1,
labelFormat: ENumericFormat.Decimal,
// label format options applied to cursors & tooltips
cursorLabelPrecision: 4,
cursorLabelFormat: ENumericFormat.Decimal
}));
// Add a CursorModifier to the chart
const cursorModifier = new CursorModifier({
showTooltip: true,
showAxisLabels: true,
hitTestRadius: 10,
});
sciChartSurface.chartModifiers.add(cursorModifier);
// #endregion
// Add some series to inspect
const xValues = [];
const yValues = [];
const yValues2 = [];
for(let i = 0; i < 50; i++) {
xValues.push(i);
yValues.push(0.2 * Math.sin(i*0.25) - Math.cos(i * 0.02));
yValues2.push(0.5 * Math.cos(i*0.18) - Math.sin(i * 0.025));
}
const pointMarker = new EllipsePointMarker(wasmContext, { width: 7, height: 7, fill: "white", strokeThickness: 0 } );
sciChartSurface.renderableSeries.add(new FastLineRenderableSeries(wasmContext, {
stroke: "#FF6600",
strokeThickness: 5,
dataSeries: new XyDataSeries(wasmContext, {
xValues,
yValues,
dataSeriesName: "Sinewave 1",
}),
pointMarker
}));
sciChartSurface.renderableSeries.add(new FastLineRenderableSeries(wasmContext, {
stroke: "#50C7E0",
strokeThickness: 5,
dataSeries: new XyDataSeries(wasmContext, {
xValues,
yValues: yValues2,
dataSeriesName: "Sinewave 2",
}),
pointMarker
}));
// Add some instructions to the user
const options = {
xCoordinateMode: ECoordinateMode.Relative,
yCoordinateMode: ECoordinateMode.Relative,
x1: 0.5,
y1: 0.0,
horizontalAnchorPoint: EHorizontalAnchorPoint.Center,
opacity: 0.33,
textColor: "White",
};
sciChartSurface.annotations.add(new TextAnnotation({
text: "CursorModifier Formatting",
fontSize: 36,
yCoordShift: 25,
... options,
}));
sciChartSurface.annotations.add(new TextAnnotation({
text: "Move the mouse over the chart to see cursor & tooltip",
fontSize: 20,
yCoordShift: 75,
... options,
}));
}
formatCursorModifier("scichart-root");
async function builderExample(divElementId) {
// Demonstrates how to configure the PinchZoomModifier in SciChart.js using the Builder API
const {
chartBuilder,
EThemeProviderType,
EAxisType,
EChart2DModifierType,
ENumericFormat
} = SciChart;
// or, for npm, import { chartBuilder, ... } from "scichart"
// #region ExampleB
const { wasmContext, sciChartSurface } = await chartBuilder.build2DChart(divElementId, {
surface: { theme: { type: EThemeProviderType.Dark } },
xAxes: {
type: EAxisType.NumericAxis,
options: {
// label format options applied to the X-Axis
labelPrecision: 2,
labelFormat: ENumericFormat.Decimal,
// label format options applied to cursors & tooltips
cursorLabelPrecision: 4,
cursorLabelFormat: ENumericFormat.Decimal
}
},
yAxes: {
type: EAxisType.NumericAxis,
options: {
// label format options applied to the X-Axis
labelPrecision: 2,
labelFormat: ENumericFormat.Decimal,
// label format options applied to cursors & tooltips
cursorLabelPrecision: 4,
cursorLabelFormat: ENumericFormat.Decimal
}
},
modifiers: [{
type: EChart2DModifierType.Cursor,
options: {
showTooltip: true,
showAxisLabels: true,
hitTestRadius: 10,
}
}]
});
// #endregion
const xValues = [];
const yValues = [];
const yValues2 = [];
for(let i = 0; i < 50; i++) {
xValues.push(i);
yValues.push(0.2 * Math.sin(i*0.25) - Math.cos(i * 0.02));
yValues2.push(0.5 * Math.cos(i*0.18) - Math.sin(i * 0.025));
}
const { EllipsePointMarker, FastLineRenderableSeries, XyDataSeries } = SciChart;
const pointMarker = new EllipsePointMarker(wasmContext, { width: 7, height: 7, fill: "white", strokeThickness: 0 } );
sciChartSurface.renderableSeries.add(new FastLineRenderableSeries(wasmContext, {
stroke: "#FF6600",
strokeThickness: 5,
dataSeries: new XyDataSeries(wasmContext, {
xValues,
yValues,
}),
pointMarker
}));
sciChartSurface.renderableSeries.add(new FastLineRenderableSeries(wasmContext, {
stroke: "#50C7E0",
strokeThickness: 5,
dataSeries: new XyDataSeries(wasmContext, {
xValues,
yValues: yValues2,
}),
pointMarker
}));
};
// Uncomment this to use the builder example
//builderExample("scichart-root");
Tooltip DataTemplates
Further customisation of tooltip content can be achieved with the CursorModifier.tooltipDataTemplate property. This defines the content inside the tooltip e.g. what values are shown (x, y, values from metadata), if the series name is shown and so on.
This property expects a function in the following format (see TCursorTooltipDataTemplate):
| tooltipDataTemplateFunction |
Copy Code
|
|---|---|
export type TCursorTooltipDataTemplate = (seriesInfos: SeriesInfo[], tooltipTitle: string) => string[]; |
|
The input/output parameters are:
- Input: an array of SeriesInfo: a data object which stores info about the series under the mouse.
- Input: a tooltipTitle (string) which comes from renderableSeries.rolloverModifierProps.tooltipTitle.
- Output: an array of strings, each one corresponding to a line in the tooltip.
Let's create a simple example which shows you how to access properties on XySeriesInfo and output to tooltips.
This results in the following output
<div id="scichart-root" ></div>
body { margin: 0; }
#scichart-root { width: 100%; height: 100vh; }
async function cursorDataTemplates(divElementId) {
const {
SciChartSurface,
NumericAxis,
FastLineRenderableSeries,
XyDataSeries,
SciChartJsNavyTheme,
CursorModifier,
TextAnnotation,
EHorizontalAnchorPoint,
ECoordinateMode,
EllipsePointMarker
} = SciChart;
// or for npm import { SciChartSurface, ... } from "scichart"
// #region ExampleA
// Create a chart surface
const { sciChartSurface, wasmContext } = await SciChartSurface.create(divElementId, {
theme: new SciChartJsNavyTheme(),
titleStyle: { fontSize: 16 }
});
sciChartSurface.xAxes.add(new NumericAxis(wasmContext));
sciChartSurface.yAxes.add(new NumericAxis(wasmContext));
// Add a CursorModifier to the chart
const cursorModifier = new CursorModifier({
showTooltip: true,
showAxisLabels: true,
hitTestRadius: 10,
// Add a custom tooltip data template
tooltipDataTemplate: (seriesInfos, tooltipTitle) => {
// each element in this array = 1 line in the tooltip
const lineItems = [];
// See SeriesInfo docs at https://scichart.com/documentation/js/current/typedoc/classes/xyseriesinfo.html
seriesInfos.forEach(si => {
// If hit (within hitTestRadius of point)
if (si.isHit) {
// SeriesInfo.seriesName comes from dataSeries.dataSeriesName
lineItems.push(`${si.seriesName}`);
// seriesInfo.xValue, yValue are available to be formatted
// Or, preformatted values are available as si.formattedXValue, si.formattedYValue
lineItems.push(`X: ${si.xValue.toFixed(2)}`);
lineItems.push(`Y: ${si.yValue.toFixed(2)}`);
// index to the dataseries is available
lineItems.push(`Index: ${si.dataSeriesIndex}`);
// Which can be used to get anything from the dataseries
lineItems.push(`Y-value from dataSeries: ${si.renderableSeries.dataSeries.getNativeYValues().get(si.dataSeriesIndex).toFixed(4)}`);
// Location of the hit in pixels is available
lineItems.push(`Location: ${si.xCoordinate.toFixed(0)}, ${si.yCoordinate.toFixed(0)}`);
}
});
return lineItems;
}
});
sciChartSurface.chartModifiers.add(cursorModifier);
// #endregion
// Add some series to inspect
const xValues = [];
const yValues = [];
const yValues2 = [];
for(let i = 0; i < 50; i++) {
xValues.push(i);
yValues.push(0.2 * Math.sin(i*0.25) - Math.cos(i * 0.02));
yValues2.push(0.5 * Math.cos(i*0.18) - Math.sin(i * 0.025));
}
const pointMarker = new EllipsePointMarker(wasmContext, { width: 7, height: 7, fill: "white", strokeThickness: 0 } );
sciChartSurface.renderableSeries.add(new FastLineRenderableSeries(wasmContext, {
stroke: "#FF6600",
strokeThickness: 5,
dataSeries: new XyDataSeries(wasmContext, {
xValues,
yValues,
dataSeriesName: "Sinewave 1",
}),
pointMarker
}));
sciChartSurface.renderableSeries.add(new FastLineRenderableSeries(wasmContext, {
stroke: "#50C7E0",
strokeThickness: 5,
dataSeries: new XyDataSeries(wasmContext, {
xValues,
yValues: yValues2,
dataSeriesName: "Sinewave 2",
}),
pointMarker
}));
// Add some instructions to the user
const options = {
xCoordinateMode: ECoordinateMode.Relative,
yCoordinateMode: ECoordinateMode.Relative,
x1: 0.5,
y1: 0.0,
horizontalAnchorPoint: EHorizontalAnchorPoint.Center,
opacity: 0.33,
textColor: "White",
};
sciChartSurface.annotations.add(new TextAnnotation({
text: "CursorModifier Custom DataTemplates",
fontSize: 36,
yCoordShift: 25,
... options,
}));
sciChartSurface.annotations.add(new TextAnnotation({
text: "Move the mouse over the chart to see cursor & tooltip",
fontSize: 20,
yCoordShift: 75,
... options,
}));
sciChartSurface.chartModifiers.add(new SciChart.LegendModifier());
}
cursorDataTemplates("scichart-root");
async function builderExample(divElementId) {
// #region ExampleB
// Demonstrates how to configure the PinchZoomModifier in SciChart.js using the Builder API
const {
chartBuilder,
EThemeProviderType,
EAxisType,
EChart2DModifierType,
} = SciChart;
// or, for npm, import { chartBuilder, ... } from "scichart"
const { wasmContext, sciChartSurface } = await chartBuilder.build2DChart(divElementId, {
surface: { theme: { type: EThemeProviderType.Dark } },
modifiers: [{
type: EChart2DModifierType.Cursor,
options: {
// Optional properties to configure what parts are shown
showTooltip: true,
showAxisLabels: true,
showXLine: true,
showYLine: true,
// How close to a datapoint to show the tooltip? 10 = 10 pixels. 0 means always
hitTestRadius: 10,
// Optional properties to configure the axis labels
axisLabelFill: "#b36200",
axisLabelStroke: "#fff",
// Optional properties to configure line and tooltip style
crosshairStroke: "#ff6600",
crosshairStrokeThickness: 1,
tooltipContainerBackground: "#000",
tooltipTextStroke: "#ff6600",
}
}]
});
// #endregion
const xValues = [];
const yValues = [];
const yValues2 = [];
for(let i = 0; i < 50; i++) {
xValues.push(i);
yValues.push(0.2 * Math.sin(i*0.25) - Math.cos(i * 0.02));
yValues2.push(0.5 * Math.cos(i*0.18) - Math.sin(i * 0.025));
}
const { EllipsePointMarker, FastLineRenderableSeries, XyDataSeries } = SciChart;
const pointMarker = new EllipsePointMarker(wasmContext, { width: 7, height: 7, fill: "white", strokeThickness: 0 } );
sciChartSurface.renderableSeries.add(new FastLineRenderableSeries(wasmContext, {
stroke: "#FF6600",
strokeThickness: 5,
dataSeries: new XyDataSeries(wasmContext, {
xValues,
yValues,
}),
pointMarker
}));
sciChartSurface.renderableSeries.add(new FastLineRenderableSeries(wasmContext, {
stroke: "#50C7E0",
strokeThickness: 5,
dataSeries: new XyDataSeries(wasmContext, {
xValues,
yValues: yValues2,
}),
pointMarker
}));
};
// Uncomment this to use the builder example
//builderExample("scichart-root");
Accessing Metadata in Tooltip DataTemplates
In the above example we access properties of XySeriesInfo to format lines in the CursorModifier tooltip.
You can also access metadata to store any custom object in your X,Y data, then read that data out in tooltips.
For a worked example see PointMetadata API - Metadata and Tooltips.