ECharts堆叠柱状图动态数据label显示总和和this指向问题

129 篇文章 3 订阅
9 篇文章 0 订阅
1、当数据为动态渲染时,获取series的数据,然后在最后一项添加label对象
let option;
// 图标参数配置
let xData = [];
let legendData = [];
let seriesData = [];
// 只取厂家名字(因为每一项的名字都返回相同的,所以只取其中一项即可)
data[0].keyValues.forEach(item => {
  let dataItem = {
    data: [],
    name: "",
    type: "bar",
    barWidth: 10,
    stack: "厂家",
    emphasis: {
      focus: "series"
    }
  };
  dataItem.name = item.name;
  legendData.push(item.name); // 图表头部厂家数据
  seriesData.push(dataItem); // series每一个厂家
})
data.forEach(item => { // 拿到数据的每一项
  xData.push(item.name); // 横轴显示的数据
  item.keyValues.forEach((it, ins) => { // 循环每一项的keyValues
    seriesData[ins].data.push(it.val); // series对应项的对应data数据
  })
});
// 最后一项添加label对象
let lastItem = {
  show: true,
  position: 'top',
  color: 'green',
  formatter: function (params){
    return params.value
  } 
}
seriesData[seriesData.length - 1].label = lastItem
2、计算总和
option = {
 tooltip: {
    trigger: "axis",
    // trigger: "item",
    axisPointer: {
      // 坐标轴指示器,坐标轴触发有效
      type: "shadow",
    },
  },
  legend: {
    data: legendData,
    // icon: "circle",
    type: "scroll",
    width: "90%",
  },
  grid: {
    top: "15%",
    left: "0%",
    right: "0%",
    bottom: "0%",
    containLabel: true,
  },
  xAxis: [
    {
      type: "category",
      data: xData,
    },
  ],
  yAxis: [
    {
      type: "value",
    },
  ],
  series: seriesData
};
// 获取配置中的series数组
var series = option["series"];
var fun = function (params) {
  var datavalue = 0;
  for (var i = 0; i < series.length; i++) {
    datavalue += series[i].data[params.dataIndex]
  }
  return datavalue;
}
series[series.length - 1]["label"]["formatter"] = fun;
this.$nextTick(() => {
  this.myChart.setOption(option);
});

在这里插入图片描述

3、切换图例选中状态后的事件(官网:https://echarts.apache.org/zh/api.html#%2Fsearch%2Flegendselectchanged) 结合events(官网:https://echarts.apache.org/zh/api.html#events
this.myChart.on("legendselectchanged", function(obj) {
console.log(obj);
  let selObj = obj.selected;
  let selArr = [];
  for (var key in selObj) {
    if (selObj[key]) {
      for (let i = 0; i < series.length; i++) {
        var changename = series[i]["name"];
        if (changename == key) {
          selArr.push(i);
        }
      }
    }
  }
  var fun =function (params) {
    var datavalue = 0;
    for (let i = 0; i < selArr.length; i++) {
      for (let j = 0; j < series.length; j++) {
        if (selArr[i] == j) {
          datavalue += series[j].data[params.dataIndex]
        }
      }
    }
    return datavalue
  }
  for (let i = 0; i < series.length; i++) {
    series[i]["label"]["show"] = false;
  }
  for (let i = series.length - 1; i >= 0; i--) {
    var name = series[i]["name"];
    if (obj["selected"][name]) {
      series[i]["label"]["formatter"] = fun
      series[i]["label"]["show"] = true
      break;
    }
  }
  this.myChart.setOption(option);
})
4、点击图例时,报错了:Uncaught TypeError: Cannot read property ‘setOption’ of undefined (this指向问题,改为箭头函数即可)

在这里插入图片描述

5、还有一个细节报错,需要在series的每一项添加label属性

在这里插入图片描述

let dataItem = {
 data: [],
 name: "",
 type: "bar",
 barWidth: 10,
 stack: "厂家",
 emphasis: {
   focus: "series"
 },
 label: {
  show: false,
}
6、 完整代码如下:
getOption(data) {
  // var myChart = this.$echarts.init(document.getElementById("echartBox"));
  let option;
  // 图标参数配置
  let xData = [];
  let legendData = [];
  let seriesData = [];
  // 只取厂家名字(因为每一项的名字都返回相同的,所以只取其中一项即可)
  data[0].keyValues.forEach(item => {
    let dataItem = {
      data: [],
      name: "",
      type: "bar",
      barWidth: 10,
      stack: "厂家",
      emphasis: {
        focus: "series"
      },
      label: {
        show: false,
      }
    };
    dataItem.name = item.name;
    legendData.push(item.name); // 图表头部厂家数据
    seriesData.push(dataItem); // series每一个厂家
  })
  data.forEach(item => { // 拿到数据的每一项
    xData.push(item.name); // 横轴显示的数据
    item.keyValues.forEach((it, ins) => { // 循环每一项的keyValues
      seriesData[ins].data.push(it.val); // series对应项的对应data数据
    })
  });
  let lastItem = {
    show: true,
    position: 'top',
    color: 'green',
    formatter: function (params){
      return params.value
    } 
  }
  seriesData[seriesData.length - 1].label = lastItem
  option = {
    tooltip: {
      trigger: "axis",
      // trigger: "item",
      axisPointer: {
        // 坐标轴指示器,坐标轴触发有效
        type: "shadow",
      },
    },
    legend: {
      data: legendData,
      // icon: "circle",
      type: "scroll",
      width: "90%",
    },
    grid: {
      top: "15%",
      left: "0%",
      right: "0%",
      bottom: "0%",
      containLabel: true,
    },
    xAxis: [
      {
        type: "category",
        data: xData,
      },
    ],
    yAxis: [
      {
        type: "value",
      },
    ],
    series: seriesData
  };
  // 获取配置中的series数组
  var series = option["series"];
  // 第一次使用的
  var fun = function (params) {
    var datavalue = 0;
    for (var i = 0; i < series.length; i++) {
      datavalue += series[i].data[params.dataIndex]
    }
    // 返回总数
    return datavalue;
  }
  // 赋值最后一项的formatter
  series[series.length - 1]["label"]["formatter"] = fun;
  // 判断,预防报错
  if(!this.myChart) {
    return
  } else {
    this.$nextTick(() => {
      this.myChart.setOption(option);
    });
  }
  if(!this.myChart) {
    return
  } else {
    // 切换图例选中状态后的事件 https://echarts.apache.org/zh/api.html#%2Fsearch%2Flegendselectchanged
    this.myChart.on("legendselectchanged", obj => {
      console.log(obj);
      // 获取点击的对象
      let selObj = obj.selected;
      let selArr = [];
      for (var key in selObj) {
        if (selObj[key]) {
          for (let i = 0; i < series.length; i++) {
            var changename = series[i]["name"];
            if (changename == key) {
              selArr.push(i);
            }
          }
        }
      }
      var fun =function (params) {
        var datavalue = 0;
        // 与name数组对比,相等则相加
        for (let i = 0; i < selArr.length; i++) {
          for (let j = 0; j < series.length; j++) {
            if (selArr[i] == j) {
              datavalue += series[j].data[params.dataIndex]
            }
          }
        }
        return datavalue
      }
      for (let i = 0; i < series.length; i++) {
        series[i]["label"]["show"] = false;
      }
      for (let i = series.length - 1; i >= 0; i--) {
        var name = series[i]["name"];
        if (obj["selected"][name]) {
          series[i]["label"]["formatter"] = fun
          series[i]["label"]["show"] = true
          break;
        }
      }
      this.$nextTick(() => {
        this.myChart.setOption(option);
      });
    })
  }
},

声明:本文转载 https://www.cnblogs.com/huaxiaguyuan/p/11097474.html

自律,不分年龄!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 在echarts中实现堆叠柱状图显示总数的方法有多种。其中一种方法是使用barGap属性为'-100%',让两个系列的柱子重叠以实现顶部显示总数的效果。但是这种方法只适合于一个X轴项且只有一个堆叠柱状图的情况。如果需要在一个X轴项上显示两个堆叠柱状图,可以考虑改变label显示来实现。具体做法是在柱状图的配置中,设置label属性的show为true,position为top,即可在柱子顶部显示数字。以上是几种常见的方法,具体应根据实际需求来选择合适的方法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [echarts 多个柱状堆叠图 顶部显示总数](https://blog.csdn.net/weixin_44167138/article/details/131064070)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [echart柱状图堆叠总计显示](https://blog.csdn.net/a15206087013/article/details/108706372)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Echarts 堆叠柱状图显示总数](https://blog.csdn.net/qq_44879525/article/details/102521303)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值