处理echarts堆叠柱状图的legend点击事件legendselectchanged

在这里插入图片描述

这个效果是三个柱子堆叠而成。

data.nian = data.nian.map((item, index) => {
	return `${item}年`
})

let chart = echarts.init(document.getElementById('school-building-chart'))
let arr = []; let datas = []
for (var i = 0; i < data.chuzhong.length; i++) {
	arr.push(Number(data.chuzhong[i]) + Number(data.xiaoxue[i]))
}
// let max = Math.max(...arr)
arr.forEach(function (item, index) {
	datas.push({
		value: item
	})
})
let option = {
  tooltip: {
    trigger: 'axis',
    axisPointer: { // 坐标轴指示器,坐标轴触发有效
      type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
    },
    formatter: function (params) {
      let message = ''
      params.forEach(function (item, index) {
        if (item.seriesName !== '') {
          message += item.seriesName + ':' + item.data + '<br>'
        }
      })
      return message
    }
  },
  legend: {
    show: true,
    right: '5%',
    top: '5%',
    orient: 'horizontal',
    icon: 'rect',
    itemWidth: 10,
    itemHeight: 10,
    textStyle: {
      fontSize: 14,
      color: '#D1D1D1'
    }
  },
  grid: {
    top: '20%',
    left: '5%',
    right: '5%',
    bottom: '5%',
    containLabel: true
  },
  xAxis: {
    type: 'category',
    boundaryGap: true,
    data: data.nian,
    axisLine: {
      lineStyle: {
        color: 'rgba(151,151,151,1)'
      },
      symbol: ['none', 'arrow'],
      symbolSize: [5, 10],
      symbolOffset: [10, 8]
    },
    axisLabel: {
      color: '#BEBEBE',
      fontSize: 12
    },
    axisTick: {
      show: false
    }
  },
  yAxis: {
    type: 'value',
    name: '所',
    nameLocation: 'end',
    splitLine: {
      show: false
    },
    axisTick: {
      show: false,
      length: 10,
      lineStyle: {
        color: '#8896b3'
      }
    },
    nameTextStyle: {
      color: '#53CABE',
      fontSize: 12
    },
    axisLabel: {
      color: '#BEBEBE',
      fontSize: 12
    },
    splitArea: {
      show: false
    },
    axisLine: {
      lineStyle: {
        color: 'rgba(151,151,151,1)'
      },
      symbol: ['none', 'arrow'],
      symbolSize: [5, 10],
      symbolOffset: [10, 8]
    }
  },
  series: [
    {
      name: '初中',
      type: 'bar',
      stack: '学校',
      itemStyle: {
        color: this.schoolBuildingColor[0]
      },
      barWidth: '15%',
      barGap: '50%',
      // 位置偏移
      barCategoryGap: '5%',
      data: data.chuzhong,
      z: 2
    },
    {
      name: '小学',
      type: 'bar',
      stack: '学校',
      itemStyle: {
        color: this.schoolBuildingColor[1]
      },
      barWidth: '15%',
      barGap: '50%',
      // 位置偏移
      barCategoryGap: '5%',
      data: data.xiaoxue,
      z: 2
    },
    {
      name: '',
      type: 'bar',
      barGap: '-100%',
      barWidth: '15%',
      z: 1,
      itemStyle: {
        color: 'transparent'
      },
      label: {
        normal: {
          show: true,
          position: 'top',
          textStyle: {
            color: '#E6E6E6',
            fontSize: 14
          },
          formatter: '{c}'
        }
      },
      data: datas
    }
  ]
}
chart.setOption(option)
// 处理legend点击事件
chart.on('legendselectchanged', function (obj) {
  if (obj.name === '初中') {
    if (obj.selected['初中'] === false && obj.selected['小学'] === true) {
      option.series[2].data = data.xiaoxue
      option.series[1].data = data.xiaoxue
      option.series[0].data = []
      option.tooltip.show = true
      chart.setOption(option)
    } else if (obj.selected['初中'] === true && obj.selected['小学'] === false) {
      option.series[2].data = data.chuzhong
      option.series[1].data = []
      option.series[0].data = data.chuzhong
      option.tooltip.show = true
      chart.setOption(option)
    } else if (obj.selected['初中'] === false && obj.selected['小学'] === false) { // 如果“初中”和“小学”legend都没选中,则底层的柱数据不显示
      option.series[2].data = []
      option.series[1].data = []
      option.series[0].data = []
      option.tooltip.show = false // 没有数据不再显示toolTip
      chart.setOption(option)
    } else if (obj.selected['初中'] === true && obj.selected['小学'] === true) {
      option.series[2].data = datas
      option.series[1].data = data.xiaoxue
      option.series[0].data = data.chuzhong
      option.tooltip.show = true
      chart.setOption(option)
    }
  } else if (obj.name === '小学') {
    if (obj.selected['小学'] === false && obj.selected['初中'] === true) {
      option.series[2].data = data.chuzhong
      option.series[1].data = []
      option.series[0].data = data.chuzhong
      option.tooltip.show = true
      chart.setOption(option)
    } else if (obj.selected['小学'] === true && obj.selected['初中'] === false) {
      option.series[2].data = data.xiaoxue
      option.series[1].data = data.xiaoxue
      option.series[0].data = []
      option.tooltip.show = true
      chart.setOption(option)
    } else if (obj.selected['初中'] === false && obj.selected['小学'] === false) { // 如果“初中”和“小学”legend都没选中,则底层的柱数据不显示
      option.series[2].data = []
      option.series[1].data = []
      option.series[0].data = []
      option.tooltip.show = false // 没有数据不再显示toolTip
      chart.setOption(option)
    } else if (obj.selected['小学'] === true && obj.selected['初中'] === true) {
      option.series[2].data = datas
      option.series[1].data = data.chuzhong
      option.series[0].data = data.xiaoxue
      option.tooltip.show = true
      chart.setOption(option)
    }
  }
})
  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如何实现? 要实现 echarts 堆叠柱状图,需要使用 echarts.js 库和一些基本的 HTML、CSS 和 JavaScript 代码。下面是实现 echarts 堆叠柱状图的基本步骤: 1. 引入 echarts.js 库。在 HTML 页面头部添加以下代码: ```html <script src="https://cdn.jsdelivr.net/npm/echarts@5.1.0/dist/echarts.min.js"></script> ``` 2. 在页面中添加一个容器用于显示柱状图。可以使用 div 元素,给它一个 ID,例如: ```html <div id="chartContainer" style="width: 800px; height: 600px;"></div> ``` 3. 编写 JavaScript 代码,创建 echarts 实例,配置图表参数,并将图表绑定到容器上。以下是一个简单的 echarts 堆叠柱状图示例代码: ```javascript // 创建 echarts 实例 var chart = echarts.init(document.getElementById('chartContainer')); // 配置图表参数 var option = { title: { text: '堆叠柱状图示例' }, tooltip: {}, legend: { data:['数据1', '数据2', '数据3'] }, xAxis: { data: ['一月', '二月', '三月', '四月', '五月', '六月'] }, yAxis: {}, series: [ { name: '数据1', type: 'bar', stack: '总量', data: [10, 20, 30, 40, 50, 60] }, { name: '数据2', type: 'bar', stack: '总量', data: [20, 30, 40, 50, 60, 70] }, { name: '数据3', type: 'bar', stack: '总量', data: [30, 40, 50, 60, 70, 80] } ] }; // 将图表绑定到容器上 chart.setOption(option); ``` 通过以上三个步骤,便可实现 echarts 堆叠柱状图。当然,以上代码仅为示例代码,实际使用时需要根据具体需求进行调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值