Data labels in EJ2 TypeScript Chart control
3 Feb 202624 minutes to read
Data labels display the values of data points directly on the chart, reducing the need to reference axes for exact values. Enable data labels by setting the visible option to true in the dataLabel configuration. Labels automatically adjust to avoid overlapping and maintain readability.
import { Chart, ColumnSeries,Category, DataLabel } from '@syncfusion/ej2-charts';
import { columnData } from './datasource.ts';
Chart.Inject(ColumnSeries,Category, DataLabel);
let chart: Chart = new Chart({
primaryXAxis: {
valueType: 'Category'
},
series: [
{
type: 'Column',
dataSource: columnData, xName: 'country', yName: 'gold',
marker: {
//Data label for chart series
dataLabel: { visible: true }
}
}
],
}, '#element');<!DOCTYPE html>
<html lang="en">
<head>
<title>EJ2 Animation</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="Typescript UI Controls" />
<meta name="author" content="Syncfusion" />
<link href="index.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/0.19.38/system.js"></script>
<script src="systemjs.config.js"></script>
<script src="https://cdn.syncfusion.com/ej2/syncfusion-helper.js" type ="text/javascript"></script>
</head>
<body>
<div id='loader'>Loading....</div>
<div id='container'>
<div id='element'></div>
</div>
</body>
</html>Note: To use the data label feature, inject
DataLabelusingChart.Inject(DataLabel)method.
Position
Use the position property to place data labels at Top, Middle, Bottom, or Outer (applicable to column and bar series). Appropriate label positioning enhances clarity and preserves chart readability.
import { Chart, ColumnSeries, Category, DataLabel } from '@syncfusion/ej2-charts';
import { columnData } from './datasource.ts';
Chart.Inject(ColumnSeries, Category, DataLabel);
let chart: Chart = new Chart({
primaryXAxis: {
valueType: 'Category'
},
primaryYAxis:
{
labelFormat: '{value}°C'
},
series: [
{
type: 'Column',
dataSource: columnData, xName: 'country', yName: 'gold',
marker: {
//Data label position as middle
dataLabel: { visible: true, position: 'Middle' }
}
}
],
}, '#element');<!DOCTYPE html>
<html lang="en">
<head>
<title>EJ2 Animation</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="Typescript UI Controls" />
<meta name="author" content="Syncfusion" />
<link href="index.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/0.19.38/system.js"></script>
<script src="systemjs.config.js"></script>
<script src="https://cdn.syncfusion.com/ej2/syncfusion-helper.js" type ="text/javascript"></script>
</head>
<body>
<div id='loader'>Loading....</div>
<div id='container'>
<div id='element'></div>
</div>
</body>
</html>Note: The
Outerposition applies only to column and bar series types.
Data Label Template
Customize label content using templates. Use placeholders such as ${point.x} and ${point.y} to display data point values. The template property enables fully customizable and visually rich labels.
import { Chart, ColumnSeries, Category, DataLabel } from '@syncfusion/ej2-charts';
import { columnData } from './datasource.ts';
Chart.Inject(ColumnSeries, Category, DataLabel);
let chart: Chart = new Chart({
primaryXAxis: {
valueType: 'Category'
},
series: [
{
type: 'Column',
dataSource: columnData, xName: 'country', yName: 'gold',
marker: {
dataLabel: { visible: true, template:'<div style="background:#f5f5f5; border: 1px solid black; padding: 3px 3px 3px 3px"><div>${point.x}</div><div>${point.y}</div></div>' }
}
}
],
}, '#element');<!DOCTYPE html>
<html lang="en">
<head>
<title>EJ2 Animation</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="Typescript UI Controls" />
<meta name="author" content="Syncfusion" />
<link href="index.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/0.19.38/system.js"></script>
<script src="systemjs.config.js"></script>
<script src="https://cdn.syncfusion.com/ej2/syncfusion-helper.js" type ="text/javascript"></script>
</head>
<body>
<div id='loader'>Loading....</div>
<div id='container'>
<div id='element'></div>
</div>
</body>
</html>Text Mapping
Display custom text using the name property, which maps label text from a specific field in the data source. This feature is useful for descriptive or category‑based labels.
import { Chart, ColumnSeries, Category, DataLabel } from '@syncfusion/ej2-charts';
Chart.Inject(ColumnSeries, Category, DataLabel);
let chart: Chart = new Chart({
primaryXAxis: {
valueType: 'Category'
},
series: [
{
type: 'Column',
dataSource: [{ x: 'Jan', y: 12, text: 'January : 12°C' }, { x: 'Feb', y: 8, text: 'February : 8°C' }, { x: 'Mar', y: 11, text: 'March : 11°C' }, { x: 'Apr', y: 6, text: 'April : 6°C' }],
xName: 'x', yName: 'y',
marker: {
visible: true,
dataLabel: { visible: true,name: 'text' }
}
}
],
}, '#element');<!DOCTYPE html>
<html lang="en">
<head>
<title>EJ2 Animation</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="Typescript UI Controls" />
<meta name="author" content="Syncfusion" />
<link href="index.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/0.19.38/system.js"></script>
<script src="systemjs.config.js"></script>
<script src="https://cdn.syncfusion.com/ej2/syncfusion-helper.js" type ="text/javascript"></script>
</head>
<body>
<div id='loader'>Loading....</div>
<div id='container'>
<div id='element'></div>
</div>
</body>
</html>Format
Apply number or date formatting using the format property. Global formatting symbols include:
-
n– number format -
p– percentage format -
c– currency format
import { Chart, ColumnSeries, Category, Legend, DataLabel, Tooltip, ISeriesRenderEventArgs,
ITextRenderEventArgs} from '@syncfusion/ej2-charts';
import { Browser } from '@syncfusion/ej2-base';
Chart.Inject(ColumnSeries, DataLabel, Category, Legend, Tooltip);
let total: any = [];
let chart: Chart = new Chart({
//Initializing Primary X and Y Axis
primaryXAxis: {
valueType: 'Category',
interval: 1,
majorGridLines: { width: 0 },
},
chartArea: { border: { width: 0 } },
primaryYAxis: {
majorGridLines: { width: 0 },
majorTickLines: { width: 0 },
lineStyle: { width: 0 },
labelStyle: { color: 'transparent' },
},
//Initializing Chart Series
series: [
{
type: 'Column',
xName: 'x',
width: 2,
yName: 'y',
name: 'Gold',
dataSource: [
{ x: 'USA', y: 46 },
{ x: 'GBR', y: 27 },
{ x: 'CHN', y: 26 },
],
marker: {
dataLabel: {
visible: true,
position: 'Top',
format: 'n2'
},
},
},
{
type: 'Column',
xName: 'x',
width: 2,
yName: 'y',
name: 'Silver',
dataSource: [
{ x: 'USA', y: 37 },
{ x: 'GBR', y: 23 },
{ x: 'CHN', y: 18 },
],
marker: {
dataLabel: {
visible: true,
position: 'Top',
format:'n2'
},
},
},
{
type: 'Column',
xName: 'x',
width: 2,
yName: 'y',
name: 'Bronze',
dataSource: [
{ x: 'USA', y: 38 },
{ x: 'GBR', y: 17 },
{ x: 'CHN', y: 26 },
],
marker: {
dataLabel: {
visible: true,
position: 'Top',
format:'n2'
},
},
},
],
//Initializing Chart Title
width: Browser.isDevice ? '100%' : '60%',
title: 'Olympic Medal Counts - RIO',
tooltip: { enable: true },
});
chart.appendTo('#element');<!DOCTYPE html>
<html lang="en">
<head>
<title>EJ2 Animation</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="Typescript UI Controls" />
<meta name="author" content="Syncfusion" />
<link href="index.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/0.19.38/system.js"></script>
<script src="systemjs.config.js"></script>
<script src="https://cdn.syncfusion.com/ej2/syncfusion-helper.js" type ="text/javascript"></script>
</head>
<body>
<div id='loader'>Loading....</div>
<div id='container'>
<div id='element'></div>
</div>
</body>
</html>| Value | Format | Resultant Value | Description |
|---|---|---|---|
| 1000 | n1 | 1000.0 | Rounded to 1 decimal place. |
| 1000 | n2 | 1000.00 | Rounded to 2 decimal places. |
| 1000 | n3 | 1000.000 | Rounded to 3 decimal places. |
| 0.01 | p1 | 1.0% | Converted to percentage with 1 decimal place. |
| 0.01 | p2 | 1.00% | Converted to percentage with 2 decimal places. |
| 0.01 | p3 | 1.000% | Converted to percentage with 3 decimal places. |
| 1000 | c1 | $1000.0 | Currency with 1 decimal place. |
| 1000 | c2 | $1000.00 | Currency with 2 decimal places. |
Margin
Adjust spacing around labels using the margin property, which includes left, right, bottom, and top values. Margins help prevent labels from overlapping chart elements.
import { Chart, ColumnSeries, Category, DataLabel } from '@syncfusion/ej2-charts';
import { columnData } from './datasource.ts';
Chart.Inject(ColumnSeries, Category, DataLabel);
let chart: Chart = new Chart({
primaryXAxis: {
valueType: 'Category'
},
series: [
{
type: 'Column',
dataSource: columnData, xName: 'country', yName: 'gold',
marker: {
dataLabel: { visible: true,
border:{width: 1, color : 'red'},
margin:{
left:5,
right:5,
top:5,
bottom:5
}
}
}
}
],
}, '#element');<!DOCTYPE html>
<html lang="en">
<head>
<title>EJ2 Animation</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="Typescript UI Controls" />
<meta name="author" content="Syncfusion" />
<link href="index.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/0.19.38/system.js"></script>
<script src="systemjs.config.js"></script>
<script src="https://cdn.syncfusion.com/ej2/syncfusion-helper.js" type ="text/javascript"></script>
</head>
<body>
<div id='loader'>Loading....</div>
<div id='container'>
<div id='element'></div>
</div>
</body>
</html>Customization
Enhance label appearance using properties such as fill (background), border, and corner radius (rx, ry). Refine text appearance using the font settings, which support color, fontFamily, fontWeight, and size.
import { Chart, ColumnSeries, Category, DataLabel } from '@syncfusion/ej2-charts';
import { columnData } from './datasource.ts';
Chart.Inject(ColumnSeries, Category, DataLabel);
let chart: Chart = new Chart({
primaryXAxis: {
valueType: 'Category'
},
series: [
{
type: 'Column',
dataSource: columnData, xName: 'country', yName: 'gold',
marker: {
dataLabel: { visible: true,
border:{width: 2, color : 'red'},
rx:10, ry: 10
}
}
}
],
}, '#element');<!DOCTYPE html>
<html lang="en">
<head>
<title>EJ2 Animation</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="Typescript UI Controls" />
<meta name="author" content="Syncfusion" />
<link href="index.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/0.19.38/system.js"></script>
<script src="systemjs.config.js"></script>
<script src="https://cdn.syncfusion.com/ej2/syncfusion-helper.js" type ="text/javascript"></script>
</head>
<body>
<div id='loader'>Loading....</div>
<div id='container'>
<div id='element'></div>
</div>
</body>
</html>Note: The
rxandryproperties require non‑nullbordervalues.
Customizing Specific Point
Customize individual markers or labels using the pointRender and textRender events.
-
pointRendermodifies shape, color, or border of a point. -
textRendercustomizes the label text for specific points.
import { Chart, LineSeries, DataLabel, IPointRenderEventArgs, ITextRenderEventArgs } from '@syncfusion/ej2-charts';
import { numData } from './datasource.ts';
Chart.Inject(LineSeries, DataLabel);
let chart: Chart = new Chart({
series: [
{
type: 'Line',
dataSource: numData, xName: 'x', yName: 'y',
marker: {
visible: true,
height: 10, width: 10,
dataLabel: { visible: true }
}
}
],
// pointRender event for chart
pointRender: (args: IPointRenderEventArgs) => {
if (args.point.index === 3) {
args.fill = 'red'
}
},
textRender: (args: ITextRenderEventArgs) => {
if (args.point.index === 3) {
args.text = 'Maximum Temperature';
args.color = 'red';
}
else {
args.cancel = true;
}
}
}, '#element');<!DOCTYPE html>
<html lang="en">
<head>
<title>EJ2 Animation</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="Typescript UI Controls" />
<meta name="author" content="Syncfusion" />
<link href="index.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/0.19.38/system.js"></script>
<script src="systemjs.config.js"></script>
<script src="https://cdn.syncfusion.com/ej2/syncfusion-helper.js" type ="text/javascript"></script>
</head>
<body>
<div id='loader'>Loading....</div>
<div id='container'>
<div id='element'></div>
</div>
</body>
</html>Show percentage based on each series points
Calculate and display percentage values based on each series’ total using the seriesRender and textRender events.
- In
seriesRender, compute the total ofyvalues. - In
textRender, calculate the percentage for each point and update the label text.
import { Chart, ColumnSeries, Category, Legend, DataLabel, Tooltip, ISeriesRenderEventArgs,
ITextRenderEventArgs} from '@syncfusion/ej2-charts';
import { Browser } from '@syncfusion/ej2-base';
Chart.Inject(ColumnSeries, DataLabel, Category, Legend, Tooltip);
let total: any = [];
let chart: Chart = new Chart({
//Initializing Primary X and Y Axis
primaryXAxis: {
valueType: 'Category',
interval: 1,
majorGridLines: { width: 0 },
},
chartArea: { border: { width: 0 } },
primaryYAxis: {
majorGridLines: { width: 0 },
majorTickLines: { width: 0 },
lineStyle: { width: 0 },
labelStyle: { color: 'transparent' },
},
//Initializing Chart Series
series: [
{
type: 'Column',
xName: 'x',
width: 2,
yName: 'y',
name: 'Gold',
dataSource: [
{ x: 'USA', y: 46 },
{ x: 'GBR', y: 27 },
{ x: 'CHN', y: 26 },
],
marker: {
dataLabel: {
visible: true,
position: 'Top',
font: { fontWeight: '600', color: '#ffffff' },
},
},
},
{
type: 'Column',
xName: 'x',
width: 2,
yName: 'y',
name: 'Silver',
dataSource: [
{ x: 'USA', y: 37 },
{ x: 'GBR', y: 23 },
{ x: 'CHN', y: 18 },
],
marker: {
dataLabel: {
visible: true,
position: 'Top',
font: { fontWeight: '600', color: '#ffffff' },
},
},
},
{
type: 'Column',
xName: 'x',
width: 2,
yName: 'y',
name: 'Bronze',
dataSource: [
{ x: 'USA', y: 38 },
{ x: 'GBR', y: 17 },
{ x: 'CHN', y: 26 },
],
marker: {
dataLabel: {
visible: true,
position: 'Top',
font: { fontWeight: '600', color: '#ffffff' },
},
},
},
],
//Initializing Chart title
width: Browser.isDevice ? '100%' : '60%',
title: 'Olympic Medal Counts - RIO',
tooltip: { enable: true },
seriesRender: (args: ISeriesRenderEventArgs) => {
for (let i = 0; i < args.data.length; i++) {
if (!total[args.data[i].x]) total[args.data[i].x] = 0;
total[args.data[i].x] += parseInt(args.data[i].y);
}
},
textRender: (args: ITextRenderEventArgs) => {
let percentage: number | string = (parseInt(args.text) / total[args.point.x]) * 100;
percentage = percentage % 1 === 0 ? percentage : percentage.toFixed(2);
args.text = percentage + '%';
},
});
chart.appendTo('#element');<!DOCTYPE html>
<html lang="en">
<head>
<title>EJ2 Animation</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="Typescript UI Controls" />
<meta name="author" content="Syncfusion" />
<link href="index.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/0.19.38/system.js"></script>
<script src="systemjs.config.js"></script>
<script src="https://cdn.syncfusion.com/ej2/syncfusion-helper.js" type ="text/javascript"></script>
</head>
<body>
<div id='loader'>Loading....</div>
<div id='container'>
<div id='element'></div>
</div>
</body>
</html>Last value label
The lastValueLabel feature highlights the final data point in a series, making the latest trend or value easy to identify.
Enable last value label
Enable the label by setting the enable property inside the lastValueLabel configuration.
import {
Chart, LineSeries, ColumnSeries, Legend, Category, Tooltip, DataLabel, LastValueLabel
} from '@syncfusion/ej2-charts';
Chart.Inject(LineSeries, ColumnSeries, Category, Legend, Tooltip, DataLabel, LastValueLabel);
let chartData: Object[] = [
{ x: 2005, y: 28 }, { x: 2006, y: 25 }, { x: 2007, y: 26 }, { x: 2008, y: 27 },
{ x: 2009, y: 32 }, { x: 2010, y: 35 }, { x: 2011, y: 40 }
];
let chart: Chart = new Chart({
primaryXAxis: {
title: 'Year',
interval: 1
},
primaryYAxis: {
title: 'Efficiency',
labelFormat: '{value}%'
},
width: '90%',
series: [{
dataSource: chartData,
xName: 'x', yName: 'y',
name: 'series1',
marker: { visible: false, dataLabel: { visible: true } },
type: 'Column', animation: { enable: true },
lastValueLabel: { enable: true }
}],
tooltip: { enable: true },
title: 'Efficiency of oil-fired power production'
}, '#element');<!DOCTYPE html>
<html lang="en">
<head>
<title>EJ2 Animation</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="Typescript UI Controls" />
<meta name="author" content="Syncfusion" />
<link href="index.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/0.19.38/system.js"></script>
<script src="systemjs.config.js"></script>
<script src="https://cdn.syncfusion.com/ej2/syncfusion-helper.js" type ="text/javascript"></script>
</head>
<body>
<div id='loader'>Loading....</div>
<div id='container'>
<div id='element'></div>
</div>
</body>
</html>Note: To use the last value label feature, inject the
LastValueLabelmodule usingChart.Inject(LastValueLabel)method.
Customization
Customize the appearance using properties such as font, background, border, dashArray, lineWidth, lineColor, rx, and ry.
import {
Chart, LineSeries, ColumnSeries, Legend, Category, Tooltip, DataLabel, LastValueLabel
} from '@syncfusion/ej2-charts';
Chart.Inject(LineSeries, ColumnSeries, Category, Legend, Tooltip, DataLabel, LastValueLabel);
let chartData: Object[] = [
{ x: 2005, y: 28 }, { x: 2006, y: 25 }, { x: 2007, y: 26 }, { x: 2008, y: 27 },
{ x: 2009, y: 32 }, { x: 2010, y: 35 }, { x: 2011, y: 40 }
];
let chart: Chart = new Chart({
primaryXAxis: {
title: 'Year',
interval: 1
},
primaryYAxis: {
title: 'Efficiency',
labelFormat: '{value}%'
},
width: '90%',
series: [{
dataSource: chartData,
xName: 'x', yName: 'y',
name: 'series1',
marker: { visible: false, dataLabel: { visible: true } },
type: 'Column', animation: { enable: true },
lastValueLabel: { enable: true, background: "blue", lineColor: "red", lineWidth: 2, dashArray: "5,5", rx: 10, ry: 10, border: { width: 2, color: "red" }, font: { color: "white", size: "12px", fontWeight: "bold" } }
}],
tooltip: { enable: true },
title: 'Efficiency of oil-fired power production'
}, '#element');<!DOCTYPE html>
<html lang="en">
<head>
<title>EJ2 Animation</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="Typescript UI Controls" />
<meta name="author" content="Syncfusion" />
<link href="index.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/0.19.38/system.js"></script>
<script src="systemjs.config.js"></script>
<script src="https://cdn.syncfusion.com/ej2/syncfusion-helper.js" type ="text/javascript"></script>
</head>
<body>
<div id='loader'>Loading....</div>
<div id='container'>
<div id='element'></div>
</div>
</body>
</html>