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

如何在AmCharts 4堆叠柱状图中按数值从小到大排序

AmCharts 4 堆叠柱状图按数值升序堆叠解决方案

需求说明

当前AmCharts 4堆叠柱状图按系列创建顺序生成堆叠,需修改为按数值从小到大绘制堆叠,同时保留原有系列定义逻辑。

实现思路

利用AmCharts的stackIndex属性控制系列堆叠顺序,在数据加载完成后,针对每个分类(示例中的年份)单独对系列数值排序,动态设置对应系列的stackIndex——数值越小的系列stackIndex越小,会被绘制在堆叠底层,以此实现按数值升序堆叠的效果。

完整代码示例

// Themes begin
am4core.useTheme(am4themes_animated);
// Themes end

// Create chart instance
var chart = am4core.create("chartdiv", am4charts.XYChart);

// Add data
chart.data = [{
  "year": "2016",
  "europe": 5.5,
  "namerica": 2.5,
  "asia": 2.1,
  "lamerica": 0.3,
  "meast": 0.2,
  "africa":4.1
}, {
  "year": "2017",
  "europe": 4.6,
  "namerica": 2.7,
  "asia": 2.2,
  "lamerica": 0.3,
  "meast": 0.3,
  "africa": 2.1
}, {
  "year": "2018",
  "europe": 3.8,
  "namerica": 2.9,
  "asia": 2.4,
  "lamerica": 0.3,
  "meast": 0.3,
  "africa": 3.1
}];

// Create axes
var categoryAxis = chart.xAxes.push(new am4charts.CategoryAxis());
categoryAxis.dataFields.category = "year";
categoryAxis.renderer.grid.template.location = 0;

var valueAxis = chart.yAxes.push(new am4charts.ValueAxis());
valueAxis.renderer.inside = true;
valueAxis.renderer.labels.template.disabled = true;
valueAxis.min = 0;

// 定义系列配置,方便统一处理
const seriesConfigs = [
  { field: "europe", name: "Europe" },
  { field: "namerica", name: "North America" },
  { field: "asia", name: "Asia-Pacific" },
  { field: "lamerica", name: "Latin America" },
  { field: "meast", name: "Middle-East" },
  { field: "africa", name: "Africa" }
];

// 存储所有创建的系列
const seriesList = [];

// Create series
function createSeries(field, name) {
  // Set up series
  var series = chart.series.push(new am4charts.ColumnSeries());
  series.name = name;
  series.dataFields.valueY = field;
  series.dataFields.categoryX = "year";
  series.sequencedInterpolation = true;
  
  // Make it stacked
  series.stacked = true;
  
  // Configure columns
  series.columns.template.width = am4core.percent(60);
  series.columns.template.tooltipText = "[bold]{name}[/]\n[font-size:14px]{categoryX}: {valueY}";
  
  // Add label
  var labelBullet = series.bullets.push(new am4charts.LabelBullet());
  labelBullet.label.text = "{valueY}";
  labelBullet.locationY = 0.5;
  labelBullet.label.hideOversized = true;
  
  return series;
}

// 创建所有系列并存储
seriesConfigs.forEach(config => {
  seriesList.push(createSeries(config.field, config.name));
});

// 数据验证完成后,动态调整每个分类的堆叠顺序
chart.events.on("datavalidated", function() {
  // 遍历每个年份数据
  chart.data.forEach(dataItem => {
    // 生成系列与对应数值的映射数组
    const seriesValuePairs = seriesList.map(series => ({
      series: series,
      value: dataItem[series.dataFields.valueY]
    }));
    
    // 按数值从小到大排序
    seriesValuePairs.sort((a, b) => a.value - b.value);
    
    // 设置每个系列的stackIndex,排序后的索引即为堆叠顺序
    seriesValuePairs.forEach((pair, index) => {
      pair.series.stackIndex = index;
    });
  });
});

// Legend
chart.legend = new am4charts.Legend();

关键说明

  • stackIndex属性:控制堆叠系列的绘制顺序,数值越小的系列被绘制在越底层,数值大的系列叠在上方。
  • datavalidated事件:确保图表数据完全加载验证后再执行排序逻辑,避免数据未就绪导致的错误。
  • 排序方向调整:若需按数值从大到小堆叠,只需将排序逻辑改为seriesValuePairs.sort((a, b) => b.value - a.value)。

内容的提问来源于stack exchange,提问作者Poojith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 15:27:56