如何在amCharts 4的正负柱状图末端显示对应数值?
在amCharts 4柱状图中为正负柱子分别在顶部/底部显示数值的解决方案
要实现正柱状顶部、负柱状末端(底部)显示对应数值,核心是通过LabelBullet结合适配器(adapter)根据数值正负动态调整标签位置。以下是修复后的完整代码:
修改后的JavaScript代码
/** * --------------------------------------- * This demo was created using amCharts 4. * * For more information visit: * https://www.amcharts.com/ * * Documentation is available at: * https://www.amcharts.com/docs/v4/ * --------------------------------------- */ // Themes begin am4core.useTheme(am4themes_animated); // Themes end // Create chart instance var chart = am4core.create("chartdiv", am4charts.XYChart); // Add data chart.data = [{ "country": "USA", "visits": 2025 }, { "country": "China", "visits": -1882 }, { "country": "Japan", "visits": 1809 }, { "country": "Germany", "visits": 1322 }, { "country": "UK", "visits": 1122 }, { "country": "France", "visits": 1114 }, { "country": "India", "visits": 984 }, { "country": "Spain", "visits": -711 }, { "country": "Netherlands", "visits": 665 }, { "country": "Russia", "visits": 580 }, { "country": "South Korea", "visits": 443 }, { "country": "Canada", "visits": 441 }, { "country": "Brazil", "visits": 395 }]; // Create axes var categoryAxis = chart.xAxes.push(new am4charts.CategoryAxis()); categoryAxis.dataFields.category = "country"; categoryAxis.renderer.grid.template.location = 0; categoryAxis.renderer.minGridDistance = 30; categoryAxis.renderer.labels.template.adapter.add("dy", function(dy, target) { if (target.dataItem && target.dataItem.index & 2 == 2) { return dy + 25; } return dy; }); var valueAxis = chart.yAxes.push(new am4charts.ValueAxis()); // Create series var series = chart.series.push(new am4charts.ColumnSeries()); series.dataFields.valueY = "visits"; series.dataFields.categoryX = "country"; series.name = "Visits"; series.columns.template.tooltipText = "{categoryX}: [bold]{valueY}[/]"; series.columns.template.fillOpacity = .8; var columnTemplate = series.columns.template; columnTemplate.strokeWidth = 2; columnTemplate.strokeOpacity = 1; // -------------------------- 新增核心代码 -------------------------- // 创建用于显示数值的标签子弹 var labelBullet = series.bullets.push(new am4charts.LabelBullet()); labelBullet.label.text = "{valueY}"; // 绑定数值字段 labelBullet.label.fill = am4core.color("#000"); // 设置标签颜色 labelBullet.label.fontSize = 12; // 设置标签字号 // 根据数值正负调整标签在柱子上的位置:正数在顶部,负数在底部 labelBullet.adapter.add("locationY", function(location, target) { var value = target.dataItem.values.valueY.value; return value > 0 ? 1 : 0; // locationY=1 是柱子顶部,0 是底部 }); // 调整标签与柱子的间距,避免重叠 labelBullet.label.adapter.add("dy", function(dy, target) { var value = target.dataItem.values.valueY.value; return value > 0 ? dy - 10 : dy + 10; // 正数向上移,负数向下移 });
核心逻辑说明
- 创建LabelBullet:给柱状图系列添加标签子弹,用于显示每个柱子的数值。
- 动态调整位置:通过
adapter监听数值,正数时将标签定位在柱子顶部(locationY=1),负数时定位在柱子底部(locationY=0)。 - 间距优化:再次通过
adapter调整标签的垂直偏移量,确保标签与柱子之间有合适间距,避免视觉重叠。
CSS和HTML代码保持不变:
CSS代码
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: 500px; }
HTML代码
<script src="https://cdn.amcharts.com/lib/4/core.js"></script> <script src="https://cdn.amcharts.com/lib/4/charts.js"></script> <script src="https://cdn.amcharts.com/lib/4/themes/animated.js"></script> <div id="chartdiv"></div>
内容的提问来源于stack exchange,提问作者Faizan Naeem
相关产品推荐
相关产品推荐

