- Size
- Neck size
- Gap between the segments
- Explode
- Smart data label
- Customization
- Modes
- See also
Contact Support
Funnel in EJ2 JavaScript Accumulation chart control
3 Apr 202524 minutes to read
To render a funnel series, use the series type
as Funnel
and inject, the FunnelSeries
module using the AccumulationChart.Inject(FunnelSeries)
method.
var chart = new ej.charts.AccumulationChart({
width: '500px',
series: [{
type: 'Funnel',
dataSource: [{ x: 'Renewed', y: 18.20, text: 'Renewed 18.20%' },
{ x: 'Subscribe', y: 27.3, text: 'Subscribe 27.3%' },
{ x: 'Support', y: 55.9, text: 'Support 55.9%' },
{ x: 'Downloaded', y: 76.8, text: 'Downloaded 76.8%' },
{ x: 'Visited', y: 100, text: 'Visited 100%' }],
xName: 'x', yName: 'y',
dataLabel: { name: 'text', visible: true, position: 'Inside' },
width: '60%', height: '90%'}
],
title: 'Website visitor',
}, '#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://cdn.syncfusion.com/ej2/29.1.33/dist/ej2.min.js" type="text/javascript"></script>
<script src="https://cdn.syncfusion.com/ej2/syncfusion-helper.js" type ="text/javascript"></script>
</head>
<body>
<div id="container">
<div id="element"></div>
</div>
<script>
var ele = document.getElementById('container');
if(ele) {
ele.style.visibility = "visible";
}
</script>
<script src="index.js" type="text/javascript"></script>
</body></html>
Size
The size of the funnel chart can be customized by using the width
and height
properties.
var chart = new ej.charts.AccumulationChart({
series: [{
type: 'Funnel',
dataSource: [{ x: 'Renewed', y: 18.20, text: 'Renewed 18.20%' },
{ x: 'Subscribe', y: 27.3, text: 'Subscribe 27.3%' },
{ x: 'Support', y: 55.9, text: 'Support 55.9%' },
{ x: 'Downloaded', y: 76.8, text: 'Downloaded 76.8%' },
{ x: 'Visited', y: 100, text: 'Visited 100%' }],
xName: 'x', yName: 'y',
//Width of the funnel will be 100% of the chart area
width: '60%',
//Height of the funnel will be 100% of the chart area
height: '80%',
dataLabel: { name: 'text', visible: true, position: 'Inside' },
}],
title: 'Website visitor',
}, '#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://cdn.syncfusion.com/ej2/29.1.33/dist/ej2.min.js" type="text/javascript"></script>
<script src="https://cdn.syncfusion.com/ej2/syncfusion-helper.js" type ="text/javascript"></script>
</head>
<body>
<div id="container">
<div id="element"></div>
</div>
<script>
var ele = document.getElementById('container');
if(ele) {
ele.style.visibility = "visible";
}
</script>
<script src="index.js" type="text/javascript"></script>
</body></html>
Neck size
The funnel’s neck size can be customized by using the neckWidth
and neckHeight
properties.
var chart = new ej.charts.AccumulationChart({
series: [{
type: 'Funnel',
dataSource: [{ x: 'Renewed', y: 18.20, text: 'Renewed 18.20%' },
{ x: 'Subscribe', y: 27.3, text: 'Subscribe 27.3%' },
{ x: 'Support', y: 55.9, text: 'Support 55.9%' },
{ x: 'Downloaded', y: 76.8, text: 'Downloaded 76.8%' },
{ x: 'Visited', y: 100, text: 'Visited 100%' }],
xName: 'x', yName: 'y',
//Width of the neck will be set as 25% of the chart area
neckWidth: '25%', neckHeight:'5%',
dataLabel: { name: 'text', visible: true, position: 'Inside' },
}],
title: 'Website visitor',
}, '#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://cdn.syncfusion.com/ej2/29.1.33/dist/ej2.min.js" type="text/javascript"></script>
<script src="https://cdn.syncfusion.com/ej2/syncfusion-helper.js" type ="text/javascript"></script>
</head>
<body>
<div id="container">
<div id="element"></div>
</div>
<script>
var ele = document.getElementById('container');
if(ele) {
ele.style.visibility = "visible";
}
</script>
<script src="index.js" type="text/javascript"></script>
</body></html>
Gap between the segments
Funnel chart provides options to customize the space between the segments by using the gapRatio
property of the series. It ranges from 0 to 1.
var pyramidchart = new ej.charts.AccumulationChart({
series: [{
type: 'Funnel',
dataSource: [{ x: 'Renewed', y: 18.20, text: 'Renewed 18.20%' },
{ x: 'Subscribe', y: 27.3, text: 'Subscribe 27.3%' },
{ x: 'Support', y: 55.9, text: 'Support 55.9%' },
{ x: 'Downloaded', y: 76.8, text: 'Downloaded 76.8%' },
{ x: 'Visited', y: 100, text: 'Visited 100%' }],
xName: 'x', yName: 'y',
dataLabel: { visible: true, name: 'text', position: 'Inside' },
// Defines the gap to be left between the segments
gapRatio: 0.04,
}],
title: 'Website visitor',
}, '#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://cdn.syncfusion.com/ej2/29.1.33/dist/ej2.min.js" type="text/javascript"></script>
<script src="https://cdn.syncfusion.com/ej2/syncfusion-helper.js" type ="text/javascript"></script>
</head>
<body>
<div id="container">
<div id="element"></div>
</div>
<script>
var ele = document.getElementById('container');
if(ele) {
ele.style.visibility = "visible";
}
</script>
<script src="index.js" type="text/javascript"></script>
</body></html>
Explode
Points can be exploded on mouse click by setting the explode
property to true. You can also explode the point on load using explodeIndex
. Explode distance can be set by using explodeOffset
property.
var piechart = new ej.charts.AccumulationChart({
series: [
{
dataSource: [
{ x: 'Jan', y: 3, text: 'Jan: 3' }, { x: 'Feb', y: 3.5, text: 'Feb: 3.5' },
{ x: 'Mar', y: 7, text: 'Mar: 7' }, { x: 'Apr', y: 13.5, text: 'Apr: 13.5' },
{ x: 'May', y: 19, text: 'May: 19' }, { x: 'Jun', y: 23.5, text: 'Jun: 23.5' },
{ x: 'Jul', y: 26, text: 'Jul: 26' }, { x: 'Aug', y: 25, text: 'Aug: 25' },
{ x: 'Sep', y: 21, text: 'Sep: 21' }, { x: 'Oct', y: 15, text: 'Oct: 15' },
{ x: 'Nov', y: 9, text: 'Nov: 9' }, { x: 'Dec', y: 3.5, text: 'Dec: 3.5' }],
dataLabel: { visible: true, name: 'text', position: 'Outside' },
groupTo: '11',
xName: 'x',
yName: 'y'
}
],
textRender: (args: IAccTextRenderEventArgs) => {
if (args.text.indexOf('Others') > -1) {
args.color = 'red';
args.border.width = 1;
}
},
pointRender: (args: IAccPointRenderEventArgs) => {
if ((args.point.x as string).indexOf('Others') > -1) {
args.fill = '#D3D3D3';
}
},
}, '#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://cdn.syncfusion.com/ej2/29.1.33/dist/ej2.min.js" type="text/javascript"></script>
<script src="https://cdn.syncfusion.com/ej2/syncfusion-helper.js" type ="text/javascript"></script>
</head>
<body>
<div id="container">
<div id="element"></div>
</div>
<script>
var ele = document.getElementById('container');
if(ele) {
ele.style.visibility = "visible";
}
</script>
<script src="index.js" type="text/javascript"></script>
</body></html>
Smart data label
It provides the data label smart arrangement of the funnel and pyramid series. The overlap data label will be placed on left side of the funnel/pyramid series.
var data = [
{ 'x': 'China', y: 1409517397, text: 'China' },
{ 'x': 'India', y: 1339180127, text: 'India' },
{ 'x': 'United States', y: 324459463, text: 'United States' },
{ 'x': 'Indonesia', y: 263991379, text: 'Indonesia' },
{ 'x': 'Brazil', y: 209288278, text: 'Brazil' },
{ 'x': 'Pakistan', y: 197015955, text: 'Pakistan' },
{ 'x': 'Nigeria', y: 190886311, text: 'Nigeria' },
{ 'x': 'Bangladesh', y: 164669751, text: 'Bangladesh' },
{ 'x': 'Russia', y: 143989754, text: 'Russia' },
{ 'x': 'Mexico', y: 129163276, text: 'Mexico' },
{ 'x': 'Japan', y: 127484450, text: ' Japan' },
{ 'x': 'Ethiopia', y: 104957438, text: 'Ethiopia' },
{ 'x': 'Philippines', y: 104918090, text: 'Philippines' },
{ 'x': 'Egypt', y: 97553151, text: 'Egypt' },
{ 'x': 'Vietnam', y: 95540800, text: 'Vietnam' },
{ 'x': 'Germany', y: 82114224, text: 'Germany' }];
var chart = new ej.charts.AccumulationChart({
series: [{
type: 'Funnel', dataSource: data, xName: 'x', yName: 'y',
neckWidth: '15%',
neckHeight: '18%',
name: '2017 Population',
dataLabel: {
visible: true, position: 'Outside',
connectorStyle: { length: '6%' }, name: 'text',
},
explode: false,
}],
legendSettings: { visible: false },
//Initializing tooltip
tooltip: { enable: true, format: '${point.x} : <b>${point.y}</b>' },
load: function (args) {
var selectedTheme = location.hash.split('/')[1];
selectedTheme = selectedTheme ? selectedTheme : 'Material';
args.accumulation.theme = (selectedTheme.charAt(0).toUpperCase() +
selectedTheme.slice(1)).replace(/-dark/i, 'Dark');
if (args.accumulation.availableSize) {
if (args.accumulation.availableSize.width < args.accumulation.availableSize.height) {
args.accumulation.series[0].width = '80%';
args.accumulation.series[0].height = '70%';
}
}
},
resized: function (args) {
var bounds = document.getElementById('container').getBoundingClientRect();
if (bounds.width < bounds.height) {
args.accumulation.series[0].width = '80%';
args.accumulation.series[0].height = '70%';
} else {
args.accumulation.series[0].width = '60%';
args.accumulation.series[0].height = '80%';
}
},
//Initializing Chart title
title: 'Top population countries in the world 2017',
}, '#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://cdn.syncfusion.com/ej2/29.1.33/dist/ej2.min.js" type="text/javascript"></script>
<script src="https://cdn.syncfusion.com/ej2/syncfusion-helper.js" type ="text/javascript"></script>
</head>
<body>
<div id="container">
<div id="element"></div>
</div>
<script>
var ele = document.getElementById('container');
if(ele) {
ele.style.visibility = "visible";
}
</script>
<script src="index.js" type="text/javascript"></script>
</body></html>
Customization
Individual points can be customized using the pointRender
event.
var piechart = new ej.charts.AccumulationChart({
series: [
{
dataSource: [
{ x: 'Renewed', y: 18.20, text: 'Renewed 18.20%' }, { x: 'Subscribe', y: 27.3, text: 'Subscribe 27.3%' },
{ x: 'Support', y: 55.9, text: 'Support 55.9%' },{ x: 'Downloaded', y: 76.8, text: 'Downloaded 76.8%' },
{ x: 'Visited', y: 100, text: 'Visited 100%' }
],
type: 'Funnel',
gapRatio: 0.08,
xName: 'x',
yName: 'y'
}
],
pointRender: (args) => {
if ((args.point.x).indexOf('Downloaded') > -1) {
args.fill = '#f4bc42';
}
else {
args.fill = '#597cf9';
}
},
}, '#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://cdn.syncfusion.com/ej2/29.1.33/dist/ej2.min.js" type="text/javascript"></script>
<script src="https://cdn.syncfusion.com/ej2/syncfusion-helper.js" type ="text/javascript"></script>
</head>
<body>
<div id="container">
<div id="element"></div>
</div>
<script>
var ele = document.getElementById('container');
if(ele) {
ele.style.visibility = "visible";
}
</script>
<script src="index.js" type="text/javascript"></script>
</body></html>
Modes
The Funnel chart supports both Standard and Trapezoidal modes of rendering. The default value of the funnelMode
is Standard
.
Standard
The Standard
funnel mode follows the traditional funnel shape, with the width continuously narrowing down to a point at the bottom.
var chart = new ej.charts.AccumulationChart({
series: [{
type: 'Funnel',
dataSource: [{ x: 'Renewed', y: 18.20, text: 'Renewed 18.20%' },
{ x: 'Subscribe', y: 27.3, text: 'Subscribe 27.3%' },
{ x: 'Support', y: 55.9, text: 'Support 55.9%' },
{ x: 'Downloaded', y: 76.8, text: 'Downloaded 76.8%' },
{ x: 'Visited', y: 100, text: 'Visited 100%' }],
xName: 'x', yName: 'y',
//Width of the funnel will be 100% of the chart area
width: '60%',
//Height of the funnel will be 100% of the chart area
height: '80%',
dataLabel: { name: 'text', visible: true, position: 'Inside' },
funnelMode: 'Standard'
}],
title: 'Website visitor',
}, '#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://cdn.syncfusion.com/ej2/29.1.33/dist/ej2.min.js" type="text/javascript"></script>
<script src="https://cdn.syncfusion.com/ej2/syncfusion-helper.js" type ="text/javascript"></script>
</head>
<body>
<div id="container">
<div id="element"></div>
</div>
<script>
var ele = document.getElementById('container');
if(ele) {
ele.style.visibility = "visible";
}
</script>
<script src="index.js" type="text/javascript"></script>
</body></html>
Trapezoidal
The Trapezoidal
mode is a modified funnel shape where the width narrows, but features a flattened or parallel section near the top, creating a trapezoidal appearance. This mode helps compare different data points more clearly while maintaining a funnel-like structure.
var chart = new ej.charts.AccumulationChart({
series: [{
type: 'Funnel',
dataSource: [{ x: 'Renewed', y: 18.20, text: 'Renewed 18.20%' },
{ x: 'Subscribe', y: 27.3, text: 'Subscribe 27.3%' },
{ x: 'Support', y: 55.9, text: 'Support 55.9%' },
{ x: 'Downloaded', y: 76.8, text: 'Downloaded 76.8%' },
{ x: 'Visited', y: 100, text: 'Visited 100%' }],
xName: 'x', yName: 'y',
//Width of the funnel will be 100% of the chart area
width: '60%',
//Height of the funnel will be 100% of the chart area
height: '80%',
dataLabel: { name: 'text', visible: true, position: 'Inside' },
funnelMode: 'Trapezoidal'
}],
title: 'Website visitor',
}, '#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://cdn.syncfusion.com/ej2/29.1.33/dist/ej2.min.js" type="text/javascript"></script>
<script src="https://cdn.syncfusion.com/ej2/syncfusion-helper.js" type ="text/javascript"></script>
</head>
<body>
<div id="container">
<div id="element"></div>
</div>
<script>
var ele = document.getElementById('container');
if(ele) {
ele.style.visibility = "visible";
}
</script>
<script src="index.js" type="text/javascript"></script>
</body></html>