Individual legend item for each column in series
This demo shows how we can create a legend to display individual items for each column in a column series, as well as trigger hovers.
Relevant code
Section titled “Relevant code”As per legend data item docs, we are using series’ dataItems list to feed the legend data, which produces an item for each column.
legend.data.setAll(chart.series.values);legend.data.setAll(chart.series.values);Additionally, we are adding pointerover and pointerout events on legend items to trigger hover (tooltip) on related column, when legend item is hovered.
legend.itemContainers.template.events.on("pointerover", function(e){ let seriesDataItem = e.target.dataItem.dataContext; if (seriesDataItem) { let graphics = seriesDataItem.get("graphics"); if (graphics) { graphics.hover(); } }});
legend.itemContainers.template.events.on("pointerout", function(e){ let seriesDataItem = e.target.dataItem.dataContext; if (seriesDataItem) { let graphics = seriesDataItem.get("graphics"); if (graphics) { graphics.unhover(); } }});legend.itemContainers.template.events.on("pointerover", function(e){ var seriesDataItem = e.target.dataItem.dataContext; if (seriesDataItem) { var graphics = seriesDataItem.get("graphics"); if (graphics) { graphics.hover(); } }});
legend.itemContainers.template.events.on("pointerout", function(e){ var seriesDataItem = e.target.dataItem.dataContext; if (seriesDataItem) { var graphics = seriesDataItem.get("graphics"); if (graphics) { graphics.unhover(); } }});Column series
Section titled “Column series”/** * --------------------------------------- * 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: true, panY: true, wheelX: "panX", wheelY: "zoomX", pinchZoomX: true, layout: root.horizontalLayout }));
// Create axes// https://www.amcharts.com/docs/v5/charts/xy-chart/axes/var xRenderer = am5xy.AxisRendererX.new(root, { minGridDistance: 30 });
var xAxis = chart.xAxes.push( am5xy.CategoryAxis.new(root, { maxDeviation: 0.3, categoryField: "country", renderer: xRenderer, tooltip: am5.Tooltip.new(root, {}) }));
var yAxis = chart.yAxes.push( am5xy.ValueAxis.new(root, { maxDeviation: 0.3, renderer: am5xy.AxisRendererY.new(root, {}) }));
// Create series// https://www.amcharts.com/docs/v5/charts/xy-chart/series/var series = chart.series.push( am5xy.ColumnSeries.new(root, { name: "Series 1", xAxis: xAxis, yAxis: yAxis, valueYField: "value", categoryXField: "country" }));
series.columns.template.setAll({ cornerRadiusTL: 5, cornerRadiusTR: 5, tooltipText: "{categoryX}: {valueYWorking.formatNumber('#.')}", tooltipY: 0});
series.columns.template.adapters.add("fill", function (fill, target) { return chart.get("colors").getIndex(series.columns.indexOf(target));});
series.columns.template.adapters.add("stroke", function (stroke, target) { return chart.get("colors").getIndex(series.columns.indexOf(target));});
// Set datavar data = [ { country: "USA", value: 2025 }, { country: "China", value: 1882 }, { country: "Japan", value: 1809 }, { country: "Germany", value: 1322 }, { country: "UK", value: 1122 }, { country: "France", value: 1114 }, { country: "India", value: 984 }, { country: "Spain", value: 711 }];
xAxis.data.setAll(data);series.data.setAll(data);
// Add the legend// https://www.amcharts.com/docs/v5/charts/xy-chart/legend-xy-series/let legend = chart.children.push( am5.Legend.new(root, { useDefaultMarker: true, nameField: "categoryX", width: 200 }));
legend.itemContainers.template.events.on("pointerover", function (e) { var seriesDataItem = e.target.dataItem.dataContext; if (seriesDataItem) { var graphics = seriesDataItem.get("graphics"); if (graphics) { graphics.hover(); } }});
legend.itemContainers.template.events.on("pointerout", function (e) { var seriesDataItem = e.target.dataItem.dataContext; if (seriesDataItem) { var graphics = seriesDataItem.get("graphics"); if (graphics) { graphics.unhover(); } }});
legend.data.setAll(series.dataItems);
// Make stuff animate on load// https://www.amcharts.com/docs/v5/concepts/animations/series.appear(1000);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": true, "panY": true, "wheelX": "panX", "wheelY": "zoomX", "pinchZoomX": true, "layout": { "type": "HorizontalLayout" } }, "properties": { "series": [ "#series-0" ], "xAxes": [ "#axis-0" ], "yAxes": [ "#axis-1" ] }, "children": [ { "type": "Legend", "settings": { "useDefaultMarker": true, "nameField": "categoryX", "width": 200 }, "properties": { "data": "#series-0.dataItems" } } ], "refs": [ { "data-0": [ { "country": "USA", "value": 2025 }, { "country": "China", "value": 1882 }, { "country": "Japan", "value": 1809 }, { "country": "Germany", "value": 1322 }, { "country": "UK", "value": 1122 }, { "country": "France", "value": 1114 }, { "country": "India", "value": 984 }, { "country": "Spain", "value": 711 } ] }, { "axis-0": { "type": "CategoryAxis", "settings": { "maxDeviation": 0.3, "categoryField": "country", "renderer": { "type": "AxisRendererX", "settings": { "minGridDistance": 30 } }, "tooltip": { "type": "Tooltip" } }, "properties": { "data": "#data-0" } } }, { "axis-1": { "type": "ValueAxis", "settings": { "maxDeviation": 0.3, "renderer": { "type": "AxisRendererY" } } } }, { "series-0": { "type": "ColumnSeries", "settings": { "name": "Series 1", "xAxis": "#axis-0", "yAxis": "#axis-1", "valueYField": "value", "categoryXField": "country" }, "properties": { "data": "#data-0", "columns": { "properties": { "template": { "settings": { "cornerRadiusTL": 5, "cornerRadiusTR": 5, "tooltipText": "{categoryX}: {valueYWorking.formatNumber('#.')}", "tooltipY": 0 } } } } } } } ]}individual-legend-item-for-each-column-in-seriesLine series with bullets
Section titled “Line series with bullets”Using Line series with bullets will require a more elaborate setup. The following demo has the code.
/** * --------------------------------------- * 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: true, panY: true, wheelY: "zoomXY", pinchZoomX: true, pinchZoomY: true, layout: root.verticalLayout }));
chart.get("colors").set("step", 2);
// Create axes// https://www.amcharts.com/docs/v5/charts/xy-chart/axes/var xAxis = chart.xAxes.push( am5xy.ValueAxis.new(root, { renderer: am5xy.AxisRendererX.new(root, { minGridDistance: 50 }), tooltip: am5.Tooltip.new(root, {}) }));
var yAxis = chart.yAxes.push( am5xy.ValueAxis.new(root, { renderer: am5xy.AxisRendererY.new(root, {}), tooltip: am5.Tooltip.new(root, {}) }));
// Create series// https://www.amcharts.com/docs/v5/charts/xy-chart/series/var series = chart.series.push( am5xy.LineSeries.new(root, { calculateAggregates: true, xAxis: xAxis, yAxis: yAxis, valueYField: "y", valueXField: "x", valueField: "value", categoryXField: "name" }));
// Add bullet// https://www.amcharts.com/docs/v5/charts/xy-chart/series/#Bulletsvar circleTemplate = am5.Template.new({});series.bullets.push(function () { var graphics = am5.Circle.new( root, { fill: series.get("fill"), tooltipText: "[bold]{name}[/b]\nx: {x}, y: {y}, value: {value}" }, circleTemplate );
graphics.adapters.add("fill", function (fill, target) { return target.dataItem?.dataContext.fill; });
return am5.Bullet.new(root, { sprite: graphics });});
// Add heat rule// https://www.amcharts.com/docs/v5/concepts/settings/heat-rules/series.set("heatRules", [ { target: circleTemplate, min: 3, max: 35, dataField: "value", key: "radius" }]);
series.strokes.template.set("strokeOpacity", 0);
// Set datavar colors = am5.ColorSet.new(root, {});var data = [ { y: 10, x: 14, value: 59, name: "One", fill: colors.next() }, { y: 5, x: 3, value: 50, name: "Two", fill: colors.next() }, { y: -10, x: 8, value: 19, name: "Three", fill: colors.next() }, { y: -6, x: 5, value: 65, name: "Four", fill: colors.next() }, { y: 15, x: -4, value: 92, name: "Five", fill: colors.next() }, { y: 13, x: 1, value: 8, name: "Six", fill: colors.next() }, { y: 1, x: 6, value: 35, name: "Seven", fill: colors.next() }];
series.data.setAll(data);
// Add legendvar legend = chart.children.push( am5.Legend.new(root, { centerX: am5.percent(50), x: am5.percent(50), nameField: "name", fillField: "fill" }));
legend.itemContainers.template.set("cursorOverStyle", "pointer");
legend.itemContainers.template.events.on("click", function (e) { am5.array.each(series.dataItems, function (dataItem) { var dataContext = dataItem.dataContext; var legendDataItem = e.target.dataItem; if (legendDataItem) { var legendDataContext = legendDataItem.dataContext; if (dataContext == legendDataContext) { if (dataItem.get("visible")) { dataItem.hide(); legendDataItem.get("itemContainer").set("disabled", true); } else { dataItem.show(); legendDataItem.get("itemContainer").set("disabled", false); } } } });});
legend.itemContainers.template.events.on("pointerover", function (e) { am5.array.each(series.dataItems, function (dataItem) { var dataContext = dataItem.dataContext; var legendDataItem = e.target.dataItem; if (legendDataItem) { var legendDataContext = legendDataItem.dataContext; if (dataContext == legendDataContext) { var bullets = dataItem.bullets; if (bullets) { let sprite = bullets[0].get("sprite"); if (sprite) { sprite.hover(); } } } } });});
legend.itemContainers.template.events.on("pointerout", function (e) { am5.array.each(series.dataItems, function (dataItem) { var dataContext = dataItem.dataContext; var legendDataItem = e.target.dataItem; if (legendDataItem) { var legendDataContext = legendDataItem.dataContext; if (dataContext == legendDataContext) { var bullets = dataItem.bullets; if (bullets) { let sprite = bullets[0].get("sprite"); if (sprite) { sprite.unhover(); } } } } });});
legend.data.setAll(data);<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": true, "panY": true, "wheelY": "zoomXY", "pinchZoomX": true, "pinchZoomY": true, "layout": { "type": "VerticalLayout" }, "colors": { "type": "ColorSet", "settings": { "step": 2 } } }, "properties": { "series": [ "#series-0" ], "xAxes": [ "#axis-0" ], "yAxes": [ "#axis-1" ] }, "children": [ { "type": "Legend", "settings": { "centerX": { "type": "Percent", "value": 50 }, "x": { "type": "Percent", "value": 50 }, "nameField": "name", "fillField": "fill" }, "properties": { "data": [ { "y": 10, "x": 14, "value": 59, "name": "One", "fill": { "type": "Color", "value": "#67b7dc" }, "__parse": true }, { "y": 5, "x": 3, "value": 50, "name": "Two", "fill": { "type": "Color", "value": "#6794dc" }, "__parse": true }, { "y": -10, "x": 8, "value": 19, "name": "Three", "fill": { "type": "Color", "value": "#6771dc" }, "__parse": true }, { "y": -6, "x": 5, "value": 65, "name": "Four", "fill": { "type": "Color", "value": "#8067dc" }, "__parse": true }, { "y": 15, "x": -4, "value": 92, "name": "Five", "fill": { "type": "Color", "value": "#a367dc" }, "__parse": true }, { "y": 13, "x": 1, "value": 8, "name": "Six", "fill": { "type": "Color", "value": "#c767dc" }, "__parse": true }, { "y": 1, "x": 6, "value": 35, "name": "Seven", "fill": { "type": "Color", "value": "#dc67ce" }, "__parse": true } ], "itemContainers": { "properties": { "template": { "settings": { "cursorOverStyle": "pointer" } } } } } } ], "refs": [ { "data-0": [ { "y": 10, "x": 14, "value": 59, "name": "One", "fill": { "type": "Color", "value": "#67b7dc" }, "__parse": true }, { "y": 5, "x": 3, "value": 50, "name": "Two", "fill": { "type": "Color", "value": "#6794dc" }, "__parse": true }, { "y": -10, "x": 8, "value": 19, "name": "Three", "fill": { "type": "Color", "value": "#6771dc" }, "__parse": true }, { "y": -6, "x": 5, "value": 65, "name": "Four", "fill": { "type": "Color", "value": "#8067dc" }, "__parse": true }, { "y": 15, "x": -4, "value": 92, "name": "Five", "fill": { "type": "Color", "value": "#a367dc" }, "__parse": true }, { "y": 13, "x": 1, "value": 8, "name": "Six", "fill": { "type": "Color", "value": "#c767dc" }, "__parse": true }, { "y": 1, "x": 6, "value": 35, "name": "Seven", "fill": { "type": "Color", "value": "#dc67ce" }, "__parse": true } ] }, { "template-0": { "type": "Template" } }, { "axis-0": { "type": "ValueAxis", "settings": { "renderer": { "type": "AxisRendererX", "settings": { "minGridDistance": 50 } }, "tooltip": { "type": "Tooltip" } } } }, { "axis-1": { "type": "ValueAxis", "settings": { "renderer": { "type": "AxisRendererY" }, "tooltip": { "type": "Tooltip" } } } }, { "series-0": { "type": "LineSeries", "settings": { "calculateAggregates": true, "xAxis": "#axis-0", "yAxis": "#axis-1", "valueYField": "y", "valueXField": "x", "valueField": "value", "categoryXField": "name", "heatRules": [ { "target": "#template-0", "min": 3, "max": 35, "dataField": "value", "key": "radius", "__parse": true } ] }, "properties": { "data": "#data-0", "strokes": { "properties": { "template": { "settings": { "strokeOpacity": 0 } } } }, "bullets": [ { "type": "Bullet", "settings": { "sprite": { "type": "Circle", "settings": { "fill": "@series.get('fill')", "tooltipText": "[bold]{name}[/b]\nx: {x}, y: {y}, value: {value}" }, "properties": { "template": "#template-0" } } } } ] } } } ]}individual-legend-item-for-each-series-data-item