Grouping legend items
This short tutorial will introduce two approaches that can be used to group legend items by inserting a label between its items.
Approach #1
Section titled “Approach #1”The easiest approach is to create a legend like we would do on any chart, set its data, then insert Label elements at predefined places in legend’s children list.
function insertLegendLabel(text, index) { let label = legend.children.insertIndex(index, am5.Label.new(root, { text: text, fontWeight: "bold", paddingLeft: 0 }));}
insertLegendLabel("Third group", 4);insertLegendLabel("Second group", 2);insertLegendLabel("First group", 0);function insertLegendLabel(text, index) { var label = legend.children.insertIndex(index, am5.Label.new(root, { text: text, fontWeight: "bold", paddingLeft: 0 }));}
insertLegendLabel("Third group", 4);insertLegendLabel("Second group", 2);insertLegendLabel("First group", 0);The downside to this approach is that we need to know specific indexes to insert labels at.
We also need to take into account that after inserting a new child (label), the indexes of the elements that go below it will shift up, hence the reversed order in the code above.
/** * --------------------------------------- * This demo was created using amCharts 5. * * For more information visit: * https://www.amcharts.com/ * * Documentation is available at: * https://www.amcharts.com/docs/v5/ * --------------------------------------- */
// Create root element// https://www.amcharts.com/docs/v5/getting-started/#Root_elementvar root = am5.Root.new("chartdiv");
// Set themes// https://www.amcharts.com/docs/v5/concepts/themes/root.setThemes([am5themes_Animated.new(root)]);
// Create chart// https://www.amcharts.com/docs/v5/charts/xy-chart/var chart = root.container.children.push( am5xy.XYChart.new(root, { panX: false, panY: false, wheelX: "panX", wheelY: "zoomX", layout: root.horizontalLayout }));
// Add legend// https://www.amcharts.com/docs/v5/charts/xy-chart/legend-xy-series/var legend = chart.children.unshift( am5.Legend.new(root, { centerY: am5.p50, y: am5.p50, layout: root.verticalLayout }));
var data = [ { year: "2021", europe: 2.5, namerica: 2.5, asia: 2.1, lamerica: 1, meast: 0.8, africa: 0.4 }, { year: "2022", europe: 2.6, namerica: 2.7, asia: 2.2, lamerica: 0.5, meast: 0.4, africa: 0.3 }, { year: "2023", europe: 2.8, namerica: 2.9, asia: 2.4, lamerica: 0.3, meast: 0.9, africa: 0.5 }];
// Create axes// https://www.amcharts.com/docs/v5/charts/xy-chart/axes/var xAxis = chart.xAxes.push( am5xy.CategoryAxis.new(root, { categoryField: "year", renderer: am5xy.AxisRendererX.new(root, { cellStartLocation: 0.1, cellEndLocation: 0.9 }),
tooltip: am5.Tooltip.new(root, {}) }));
xAxis.data.setAll(data);
var yAxis = chart.yAxes.push( am5xy.ValueAxis.new(root, { renderer: am5xy.AxisRendererY.new(root, {}) }));
// Add series// https://www.amcharts.com/docs/v5/charts/xy-chart/series/function makeSeries(name, fieldName) { var series = chart.series.push( am5xy.ColumnSeries.new(root, { name: name, xAxis: xAxis, yAxis: yAxis, valueYField: fieldName, categoryXField: "year" }) );
series.columns.template.setAll({ tooltipText: "{name}, {categoryX}:{valueY}", width: am5.percent(90), tooltipY: 0 });
series.data.setAll(data);
// Make stuff animate on load // https://www.amcharts.com/docs/v5/concepts/animations/ series.appear();
series.bullets.push(function () { return am5.Bullet.new(root, { locationY: 0, sprite: am5.Label.new(root, { text: "{valueY}", fill: root.interfaceColors.get("alternativeText"), centerY: 0, centerX: am5.p50, populateText: true }) }); });
legend.data.push(series);}
makeSeries("Europe", "europe");makeSeries("North America", "namerica");makeSeries("Asia", "asia");makeSeries("Latin America", "lamerica");makeSeries("Middle East", "meast");makeSeries("Africa", "africa");
// Insert labels in legendfunction insertLegendLabel(text, index) { var label = legend.children.insertIndex( index, am5.Label.new(root, { text: text, fontWeight: "bold", paddingLeft: 0 }) );}
insertLegendLabel("Third group", 4);insertLegendLabel("Second group", 2);insertLegendLabel("First group", 0);
// Make stuff animate on load// https://www.amcharts.com/docs/v5/concepts/animations/chart.appear(1000, 100);<div id="chartdiv"></div>body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";}
#chartdiv { width: 100%; height: 95vh;}grouping-legend-items-with-labels-at-specific-indexApproach #2
Section titled “Approach #2”This approach is more sophisticated, and thus requires more steps.
First, we create a Container that will act as a placeholder for our multiple legends.
Then we create a Label and a Legend element for each group, which we then push into container’s children.
let legendContainer = chart.children.unshift(am5.Container.new(root, { centerY: am5.p50, y: am5.p50, layout: root.verticalLayout}));
function createLegend(heading, items) { let label = legendContainer.children.push(am5.Label.new(root, { text: heading, fontWeight: "bold", paddingLeft: 0 }));
let legend = legendContainer.children.push( am5.Legend.new(root, { layout: root.verticalLayout }) );
legend.data.setAll(items);}
createLegend("First group", [series1, series2]);createLegend("Second group", [series3, series4]);createLegend("Third group", [series5, series6]);var legendContainer = chart.children.unshift(am5.Container.new(root, { centerY: am5.p50, y: am5.p50, layout: root.verticalLayout}));
function createLegend(heading, items) { var label = legendContainer.children.push(am5.Label.new(root, { text: heading, fontWeight: "bold", paddingLeft: 0 }));
var legend = legendContainer.children.push( am5.Legend.new(root, { layout: root.verticalLayout }) );
legend.data.setAll(items);}
createLegend("First group", [series1, series2]);createLegend("Second group", [series3, series4]);createLegend("Third group", [series5, series6]);This allows more control and leaves less chance for an error.
/** * --------------------------------------- * This demo was created using amCharts 5. * * For more information visit: * https://www.amcharts.com/ * * Documentation is available at: * https://www.amcharts.com/docs/v5/ * --------------------------------------- */
// Create root element// https://www.amcharts.com/docs/v5/getting-started/#Root_elementvar root = am5.Root.new("chartdiv");
// Set themes// https://www.amcharts.com/docs/v5/concepts/themes/root.setThemes([am5themes_Animated.new(root)]);
// Create chart// https://www.amcharts.com/docs/v5/charts/xy-chart/var chart = root.container.children.push( am5xy.XYChart.new(root, { panX: false, panY: false, wheelX: "panX", wheelY: "zoomX", layout: root.horizontalLayout }));
var data = [ { year: "2021", europe: 2.5, namerica: 2.5, asia: 2.1, lamerica: 1, meast: 0.8, africa: 0.4 }, { year: "2022", europe: 2.6, namerica: 2.7, asia: 2.2, lamerica: 0.5, meast: 0.4, africa: 0.3 }, { year: "2023", europe: 2.8, namerica: 2.9, asia: 2.4, lamerica: 0.3, meast: 0.9, africa: 0.5 }];
// Create axes// https://www.amcharts.com/docs/v5/charts/xy-chart/axes/var xAxis = chart.xAxes.push( am5xy.CategoryAxis.new(root, { categoryField: "year", renderer: am5xy.AxisRendererX.new(root, { cellStartLocation: 0.1, cellEndLocation: 0.9 }),
tooltip: am5.Tooltip.new(root, {}) }));
xAxis.data.setAll(data);
var yAxis = chart.yAxes.push( am5xy.ValueAxis.new(root, { renderer: am5xy.AxisRendererY.new(root, {}) }));
// Add series// https://www.amcharts.com/docs/v5/charts/xy-chart/series/function makeSeries(name, fieldName) { var series = chart.series.push( am5xy.ColumnSeries.new(root, { name: name, xAxis: xAxis, yAxis: yAxis, valueYField: fieldName, categoryXField: "year" }) );
series.columns.template.setAll({ tooltipText: "{name}, {categoryX}:{valueY}", width: am5.percent(90), tooltipY: 0 });
series.data.setAll(data);
// Make stuff animate on load // https://www.amcharts.com/docs/v5/concepts/animations/ series.appear();
series.bullets.push(function () { return am5.Bullet.new(root, { locationY: 0, sprite: am5.Label.new(root, { text: "{valueY}", fill: root.interfaceColors.get("alternativeText"), centerY: 0, centerX: am5.p50, populateText: true }) }); });
return series;}
var series1 = makeSeries("Europe", "europe");var series2 = makeSeries("North America", "namerica");var series3 = makeSeries("Asia", "asia");var series4 = makeSeries("Latin America", "lamerica");var series5 = makeSeries("Middle East", "meast");var series6 = makeSeries("Africa", "africa");
// Create legendsvar legendContainer = chart.children.unshift( am5.Container.new(root, { centerY: am5.p50, y: am5.p50, layout: root.verticalLayout }));
function createLegend(heading, items) { var label = legendContainer.children.push( am5.Label.new(root, { text: heading, fontWeight: "bold", paddingLeft: 0 }) );
var legend = legendContainer.children.push( am5.Legend.new(root, { layout: root.verticalLayout }) );
legend.data.setAll(items);}
createLegend("First group", [series1, series2]);createLegend("Second group", [series3, series4]);createLegend("Third group", [series5, series6]);
// Make stuff animate on load// https://www.amcharts.com/docs/v5/concepts/animations/chart.appear(1000, 100);<div id="chartdiv"></div>body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";}
#chartdiv { width: 100%; height: 95vh;}{ "type": "XYChart", "settings": { "panX": false, "panY": false, "wheelX": "panX", "wheelY": "zoomX", "layout": { "type": "HorizontalLayout" } }, "properties": { "series": [ "#series-0", "#series-1", "#series-2", "#series-3", "#series-4", "#series-5" ], "xAxes": [ "#axis-0" ], "yAxes": [ "#axis-1" ] }, "children": [ { "type": "Container", "settings": { "centerY": { "type": "Percent", "value": 50 }, "y": { "type": "Percent", "value": 50 }, "layout": { "type": "VerticalLayout" } }, "children": [ { "type": "Label", "settings": { "text": "First group", "fontWeight": "bold", "paddingLeft": 0 } }, { "type": "Label", "settings": { "text": "Second group", "fontWeight": "bold", "paddingLeft": 0 } }, { "type": "Label", "settings": { "text": "Third group", "fontWeight": "bold", "paddingLeft": 0 } }, { "type": "Legend", "settings": { "layout": { "type": "VerticalLayout" } }, "properties": { "data": [ "#series-0", "#series-1" ] }, "index": 1 }, { "type": "Legend", "settings": { "layout": { "type": "VerticalLayout" } }, "properties": { "data": [ "#series-2", "#series-3" ] }, "index": 3 }, { "type": "Legend", "settings": { "layout": { "type": "VerticalLayout" } }, "properties": { "data": [ "#series-4", "#series-5" ] } } ], "index": 0 } ], "refs": [ { "data-0": [ { "year": "2021", "europe": 2.5, "namerica": 2.5, "asia": 2.1, "lamerica": 1, "meast": 0.8, "africa": 0.4 }, { "year": "2022", "europe": 2.6, "namerica": 2.7, "asia": 2.2, "lamerica": 0.5, "meast": 0.4, "africa": 0.3 }, { "year": "2023", "europe": 2.8, "namerica": 2.9, "asia": 2.4, "lamerica": 0.3, "meast": 0.9, "africa": 0.5 } ] }, { "axis-0": { "type": "CategoryAxis", "settings": { "categoryField": "year", "renderer": { "type": "AxisRendererX", "settings": { "cellStartLocation": 0.1, "cellEndLocation": 0.9 } }, "tooltip": { "type": "Tooltip" } }, "properties": { "data": "#data-0" } } }, { "axis-1": { "type": "ValueAxis", "settings": { "renderer": { "type": "AxisRendererY" } } } }, { "series-0": { "type": "ColumnSeries", "settings": { "name": "Europe", "xAxis": "#axis-0", "yAxis": "#axis-1", "valueYField": "europe", "categoryXField": "year" }, "properties": { "data": "#data-0", "columns": { "properties": { "template": { "settings": { "tooltipText": "{name}, {categoryX}:{valueY}", "width": { "type": "Percent", "value": 90 }, "tooltipY": 0 } } } }, "bullets": [ { "type": "Bullet", "settings": { "locationY": 0, "sprite": { "type": "Label", "settings": { "text": "{valueY}", "fill": "@root.interfaceColors.get('alternativeText')", "centerY": 0, "centerX": { "type": "Percent", "value": 50 }, "populateText": true } } } } ] } } }, { "series-1": { "type": "ColumnSeries", "settings": { "name": "North America", "xAxis": "#axis-0", "yAxis": "#axis-1", "valueYField": "namerica", "categoryXField": "year" }, "properties": { "data": "#data-0", "columns": { "properties": { "template": { "settings": { "tooltipText": "{name}, {categoryX}:{valueY}", "width": { "type": "Percent", "value": 90 }, "tooltipY": 0 } } } }, "bullets": [ { "type": "Bullet", "settings": { "locationY": 0, "sprite": { "type": "Label", "settings": { "text": "{valueY}", "fill": "@root.interfaceColors.get('alternativeText')", "centerY": 0, "centerX": { "type": "Percent", "value": 50 }, "populateText": true } } } } ] } } }, { "series-2": { "type": "ColumnSeries", "settings": { "name": "Asia", "xAxis": "#axis-0", "yAxis": "#axis-1", "valueYField": "asia", "categoryXField": "year" }, "properties": { "data": "#data-0", "columns": { "properties": { "template": { "settings": { "tooltipText": "{name}, {categoryX}:{valueY}", "width": { "type": "Percent", "value": 90 }, "tooltipY": 0 } } } }, "bullets": [ { "type": "Bullet", "settings": { "locationY": 0, "sprite": { "type": "Label", "settings": { "text": "{valueY}", "fill": "@root.interfaceColors.get('alternativeText')", "centerY": 0, "centerX": { "type": "Percent", "value": 50 }, "populateText": true } } } } ] } } }, { "series-3": { "type": "ColumnSeries", "settings": { "name": "Latin America", "xAxis": "#axis-0", "yAxis": "#axis-1", "valueYField": "lamerica", "categoryXField": "year" }, "properties": { "data": "#data-0", "columns": { "properties": { "template": { "settings": { "tooltipText": "{name}, {categoryX}:{valueY}", "width": { "type": "Percent", "value": 90 }, "tooltipY": 0 } } } }, "bullets": [ { "type": "Bullet", "settings": { "locationY": 0, "sprite": { "type": "Label", "settings": { "text": "{valueY}", "fill": "@root.interfaceColors.get('alternativeText')", "centerY": 0, "centerX": { "type": "Percent", "value": 50 }, "populateText": true } } } } ] } } }, { "series-4": { "type": "ColumnSeries", "settings": { "name": "Middle East", "xAxis": "#axis-0", "yAxis": "#axis-1", "valueYField": "meast", "categoryXField": "year" }, "properties": { "data": "#data-0", "columns": { "properties": { "template": { "settings": { "tooltipText": "{name}, {categoryX}:{valueY}", "width": { "type": "Percent", "value": 90 }, "tooltipY": 0 } } } }, "bullets": [ { "type": "Bullet", "settings": { "locationY": 0, "sprite": { "type": "Label", "settings": { "text": "{valueY}", "fill": "@root.interfaceColors.get('alternativeText')", "centerY": 0, "centerX": { "type": "Percent", "value": 50 }, "populateText": true } } } } ] } } }, { "series-5": { "type": "ColumnSeries", "settings": { "name": "Africa", "xAxis": "#axis-0", "yAxis": "#axis-1", "valueYField": "africa", "categoryXField": "year" }, "properties": { "data": "#data-0", "columns": { "properties": { "template": { "settings": { "tooltipText": "{name}, {categoryX}:{valueY}", "width": { "type": "Percent", "value": 90 }, "tooltipY": 0 } } } }, "bullets": [ { "type": "Bullet", "settings": { "locationY": 0, "sprite": { "type": "Label", "settings": { "text": "{valueY}", "fill": "@root.interfaceColors.get('alternativeText')", "centerY": 0, "centerX": { "type": "Percent", "value": 50 }, "populateText": true } } } } ] } } } ]}grouping-legend-items-with-separate-legends