You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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; // 正数向上移,负数向下移
});

核心逻辑说明

  1. 创建LabelBullet:给柱状图系列添加标签子弹,用于显示每个柱子的数值。
  2. 动态调整位置:通过adapter监听数值,正数时将标签定位在柱子顶部(locationY=1),负数时定位在柱子底部(locationY=0)。
  3. 间距优化:再次通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 08:36:26