ECharts动态图例与X轴堆叠柱状图实现方案

作者:清欢

时间:2026-10-26

浏览:548

本文介绍如何在ECharts中实现图例和X轴均为动态数据的堆叠柱状图。核心思路是将原始数据转换为符合ECharts结构的数组,确保series中的name与图例对应,并通过stack属性控制堆叠。通过遍历数据去重生成X轴,并重组series数据,即可实现动态展示效果。

文章目录

问题描述:

ECharts中的堆叠柱状图应用广泛,官方示例通常较为简单,其中图例(legend)和X轴(xAxis)多为静态配置。然而在实际业务场景中,这些数据往往是动态变化的。本文将通过一个具体案例,演示如何实现图例和X轴均动态生成的堆叠柱状图。

问题描述:

参考ECharts官网提供的堆叠柱状图示例。

实现思路及步骤:

基于官网示例,我们需要明确以下关键点:

  1. X轴(xAxis)配置为一个数组。
  2. 系列(series)是一个对象数组,其中的name字段需与图例名称一一对应。因此,若有N个图例,series数组中必须包含N个对应的项。我们需要对原始数据进行转换,使其结构符合示例要求。
  3. stack属性至关重要,参考Documentation - Apache ECharts stack API。在官网示例中,若stack值相同的数据会被堆叠在一起(stack有几个不同的值,就会形成几组堆叠,例如Ad和Search Engine)。若移除没有stack属性的数据,则表现为并列柱状图。

理解上述机制后,实现过程便清晰明了。

  • 第一步:遍历原始数据,提取并去重X轴所需的数据。
  • 第二步:遍历数据生成series配置。

这本质上是对原始数据进行重组和处理的过程。

示例:

将如下格式的数据转换为堆叠图所需结构:

let data = [
        { 日期: '2022-08-16', 要素名称: '空调液加注-正压压力', 报警总次数: 15 },
        { 日期: '2022-08-16', 要素名称: '空调液加注-正压检漏值', 报警总次数: 3 },
        { 日期: '2022-08-16', 要素名称: '刹车液加注-正压压力', 报警总次数: 5 },
        { 日期: '2022-08-17', 要素名称: '刹车液加注-二次抽真空值', 报警总次数: 6 },
        { 日期: '2022-08-17', 要素名称: '刹车液加注-二次抽真空时间', 报警总次数: 6 },
        { 日期: '2022-08-17', 要素名称: '刹车液加注-加注量', 报警总次数: 3 },
        { 日期: '2022-08-17', 要素名称: '空调液加注-正压压力', 报警总次数: 45 }, ,
        { 日期: '2022-08-17', 要素名称: '刹车液加注-真空检漏值', 报警总次数: 3 },
        { 日期: '2022-08-17', 要素名称: '刹车液加注-含水量', 报警总次数: 3 },
        { 日期: '2022-08-17', 要素名称: '刹车液加注-真空检漏时间', 报警总次数: 3 },
        { 日期: '2022-08-17', 要素名称: '空调液加注-二次抽真空值', 报警总次数: 3 },
        { 日期: '2022-08-17', 要素名称: '刹车液加注-正压压力', 报警总次数: 15 },
        { 日期: '2022-08-18', 要素名称: '刹车液加注-加注量', 报警总次数: 6 },
        { 日期: '2022-08-18', 要素名称: '刹车液加注-正压压力', 报警总次数: 23 },
        { 日期: '2022-08-18', 要素名称: '刹车液加注-正压检漏值', 报警总次数: 3 },
        { 日期: '2022-08-18', 要素名称: '空调液加注-加注量', 报警总次数: 3 },
        { 日期: '2022-08-18', 要素名称: '刹车液加注-精真空值', 报警总次数: 6 },
        { 日期: '2022-08-18', 要素名称: '空调液加注-正压压力', 报警总次数: 69 },
        { 日期: '2022-08-18', 要素名称: '空调液加注-正压检漏时间', 报警总次数: 3 },
        { 日期: '2022-08-19', 要素名称: '刹车液加注-含水量', 报警总次数: 6 },
        { 日期: '2022-08-19', 要素名称: '刹车液加注-正压压力', 报警总次数: 31 },
        { 日期: '2022-08-19', 要素名称: '刹车液加注-精真空值', 报警总次数: 12 },
        { 日期: '2022-08-19', 要素名称: '空调液加注-正压压力', 报警总次数: 99 },
        { 日期: '2022-08-19', 要素名称: '刹车液加注-真空检漏值', 报警总次数: 6 },
        { 日期: '2022-08-19', 要素名称: '空调液加注-正压检漏值', 报警总次数: 6 },
        { 日期: '2022-08-19', 要素名称: '空调液加注-正压检漏时间', 报警总次数: 6 },
        { 日期: '2022-08-19', 要素名称: '空调液加注-真空检漏值', 报警总次数: 12 },
        { 日期: '2022-08-20', 要素名称: '刹车液加注-加注量', 报警总次数: 12 },
        { 日期: '2022-08-20', 要素名称: '刹车液加注-含水量', 报警总次数: 12 },
        { 日期: '2022-08-20', 要素名称: '刹车液加注-正压检漏值', 报警总次数: 9 },
        { 日期: '2022-08-20', 要素名称: '刹车液加注-正压检漏时间', 报警总次数: 6 },
        { 日期: '2022-08-20', 要素名称: '刹车液加注-真空检漏时间', 报警总次数: 9 },
        { 日期: '2022-08-20', 要素名称: '空调液加注-加注量', 报警总次数: 9 },
        { 日期: '2022-08-20', 要素名称: '刹车液加注-真空检漏值', 报警总次数: 9 },
        { 日期: '2022-08-20', 要素名称: '空调液加注-正压检漏值', 报警总次数: 12 },
        { 日期: '2022-08-20', 要素名称: '空调液加注-真空检漏值', 报警总次数: 15 },
    ];

问题描述:

代码实现:

将该段代码嵌入官网示例中即可看到动态效果。

let data = [
        { 日期: '2022-08-16', 要素名称: '空调液加注-正压压力', 报警总次数: 15 },
        { 日期: '2022-08-16', 要素名称: '空调液加注-正压检漏值', 报警总次数: 3 },
        { 日期: '2022-08-16', 要素名称: '刹车液加注-正压压力', 报警总次数: 5 },
        { 日期: '2022-08-17', 要素名称: '刹车液加注-二次抽真空值', 报警总次数: 6 },
        { 日期: '2022-08-17', 要素名称: '刹车液加注-二次抽真空时间', 报警总次数: 6 },
        { 日期: '2022-08-17', 要素名称: '刹车液加注-加注量', 报警总次数: 3 },
        { 日期: '2022-08-17', 要素名称: '空调液加注-正压压力', 报警总次数: 45 }, ,
        { 日期: '2022-08-17', 要素名称: '刹车液加注-真空检漏值', 报警总次数: 3 },
        { 日期: '2022-08-17', 要素名称: '刹车液加注-含水量', 报警总次数: 3 },
        { 日期: '2022-08-17', 要素名称: '刹车液加注-真空检漏时间', 报警总次数: 3 },
        { 日期: '2022-08-17', 要素名称: '空调液加注-二次抽真空值', 报警总次数: 3 },
        { 日期: '2022-08-17', 要素名称: '刹车液加注-正压压力', 报警总次数: 15 },
        { 日期: '2022-08-18', 要素名称: '刹车液加注-加注量', 报警总次数: 6 },
        { 日期: '2022-08-18', 要素名称: '刹车液加注-正压压力', 报警总次数: 23 },
        { 日期: '2022-08-18', 要素名称: '刹车液加注-正压检漏值', 报警总次数: 3 },
        { 日期: '2022-08-18', 要素名称: '空调液加注-加注量', 报警总次数: 3 },
        { 日期: '2022-08-18', 要素名称: '刹车液加注-精真空值', 报警总次数: 6 },
        { 日期: '2022-08-18', 要素名称: '空调液加注-正压压力', 报警总次数: 69 },
        { 日期: '2022-08-18', 要素名称: '空调液加注-正压检漏时间', 报警总次数: 3 },
        { 日期: '2022-08-19', 要素名称: '刹车液加注-含水量', 报警总次数: 6 },
        { 日期: '2022-08-19', 要素名称: '刹车液加注-正压压力', 报警总次数: 31 },
        { 日期: '2022-08-19', 要素名称: '刹车液加注-精真空值', 报警总次数: 12 },
        { 日期: '2022-08-19', 要素名称: '空调液加注-正压压力', 报警总次数: 99 },
        { 日期: '2022-08-19', 要素名称: '刹车液加注-真空检漏值', 报警总次数: 6 },
        { 日期: '2022-08-19', 要素名称: '空调液加注-正压检漏值', 报警总次数: 6 },
        { 日期: '2022-08-19', 要素名称: '空调液加注-正压检漏时间', 报警总次数: 6 },
        { 日期: '2022-08-19', 要素名称: '空调液加注-真空检漏值', 报警总次数: 12 },
        { 日期: '2022-08-20', 要素名称: '刹车液加注-加注量', 报警总次数: 12 },
        { 日期: '2022-08-20', 要素名称: '刹车液加注-含水量', 报警总次数: 12 },
        { 日期: '2022-08-20', 要素名称: '刹车液加注-正压检漏值', 报警总次数: 9 },
        { 日期: '2022-08-20', 要素名称: '刹车液加注-正压检漏时间', 报警总次数: 6 },
        { 日期: '2022-08-20', 要素名称: '刹车液加注-真空检漏时间', 报警总次数: 9 },
        { 日期: '2022-08-20', 要素名称: '空调液加注-加注量', 报警总次数: 9 },
        { 日期: '2022-08-20', 要素名称: '刹车液加注-真空检漏值', 报警总次数: 9 },
        { 日期: '2022-08-20', 要素名称: '空调液加注-正压检漏值', 报警总次数: 12 },
        { 日期: '2022-08-20', 要素名称: '空调液加注-真空检漏值', 报警总次数: 15 },
    ];
    console.log(data)
    let date = []; //x轴日期
    let lenged = []; //series的个数
    let s = [];
    data.map((item) => {
        date.push(item["日期"]);
        lenged.push(item["要素名称"]);
 
    });
 
    date = [...new Set(date)]; //去重
    lenged = [...new Set(lenged)];
    console.log(date, lenged)
    let series = [];
    lenged.map((item) => { //生成  series
        let obj = {
            name: item,
            type: "bar",
            stack: "As",
            emphasis: {
                focus: 'series'
            },
            data: []
        };
        series.push(obj);
    });
    console.log(series)
 
    data.map((item) => {//对series 的data进行处理
 
        series.map((item1) => {
 
            if (item1.name == item["要素名称"] && date.indexOf(item["日期"]) > -1) {
                item1.data[date.indexOf(item["日期"])] = item["报警总次数"]
            };
        })
    })
   
option = {
  tooltip: {
    trigger: 'axis',
    axisPointer: {
      type: 'shadow'
    }
  },
  legend: {},
  grid: {
    left: '3%',
    right: '4%',
    bottom: '3%',
    containLabel: true
  },
  xAxis: [
    {
      type: 'category',
      data: date
    }
  ],
  yAxis: [
    {
      type: 'value'
    }
  ],
  series: series
};

总结

至此,关于ECharts动态图例与X轴堆叠柱状图的实现介绍完毕。如需了解更多相关内容,可搜索本站往期文章或继续浏览后续文章,感谢支持!

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章