echarts实现环状图显示总数,并在hover时显示自定义数据

博客围绕ECharts(版本^4.2.1)实现饼图中间显示总数功能展开。介绍采用title显示总数时出现高亮不显示内容的问题,通过鼠标移入隐藏、移出显示title的逻辑处理,解决了原始emphasis事件失效等问题,最终完成预期效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现饼图中间显示总数功能,版本:“echarts”: “^4.2.1”

在网上看到了几个前辈给出的饼图显示总数的实现方法,本方法采用了title来显示总数,但出现了高亮不显示内容的bug,具体情况如下

代码部分

InitroundPie () {
      this.chart = echarts.init(this.$refs[this.bindRef])
      let _data = [ // 当前写死
        { value: 120, name: '在线' },
        { value: 120, name: '离线' },
        { value: 160, name: '未激活' }
      ]

      let options = {
        title: {
          show: true,
          text: '全部', // 当前写死
          subtext: '400', // 当前写死
          top: 95,
          left: 115,
          textAlign: 'center',
          textStyle: {
            fontSize: '14',
            fontWeight: 'bold'
          },
          subtextStyle: {
            fontSize: '20',
            fontWeight: 'bold'
          }
        },
        tooltip: {
          show: false,
          trigger: 'item',
          formatter: '{a} <br/>{b}: {c} ({d}%)'
        },
        legend: {
          orient: 'vertical',
          x: 'right',
          data: ['在线', '离线', '未激活'],
          selectedMode: false,
          top: 40,
          formatter: function (name) {
            let legenTile = name + ': '
            for (let item of _data) {
              if (name === item.name) legenTile += item.value
            }
            return legenTile
          }
        },
        series: [
          {
            name: 'from',
            type: 'pie',
            radius: ['50%', '70%'],
            avoidLabelOverlap: false,
            hoverAnimation: false,
            textAlign: 'center',
            center: [120, 120],
            label: {
              normal: {
                show: false,
                position: 'center',
                formatter: '{b}\n{c}',
                align: 'center',
                verticalAlign: 'middle'
              },
              emphasis: {
                show: true,
                textStyle: {
                  fontSize: '20',
                  fontWeight: 'bold'
                }
              }
            },
            labelLine: {
              normal: {
                show: false
              }
            },
            data: _data
          }
        ]
      }

      this.chart.setOption(options)

      this.chart.on('mouseover', { seriesName: 'from' }, () => {
        this.chart.setOption({
          title: {
            show: false
          }
        })
      })

      this.chart.on('mouseout', { seriesName: 'from' }, () => {
        this.chart.setOption({
          title: {
            show: true
          }
        })
      })
    },

方法逻辑:在鼠标移入时隐藏title,移出时显示title,此方法实现效果如下:
在这里插入图片描述
展示效果正常,但当鼠标悬浮至数据上时,title.show:false后,原始的emphasis事件失效,情况如下:
在这里插入图片描述
使用dispatchAction事件主动触发也不能触发当前选中,但能触发其它选中,使用其它方法进行了解决。

代码如下:

InitroundPie () {
      this.chart = echarts.init(this.$refs[this.bindRef])

      let _data = [
        { value: 120, name: '在线' },
        { value: 120, name: '离线' },
        { value: 160, name: '未激活' }
      ]

      let options = {
        title: {
          show: true,
          text: '全部',
          subtext: '400',
          top: 95,
          left: 115,
          textAlign: 'center',
          z: 0,
          textStyle: {
            fontSize: '14',
            fontWeight: 'bold'
          },
          subtextStyle: {
            fontSize: '20',
            fontWeight: 'bold'
          }
        },
        tooltip: {
          show: false,
          trigger: 'item',
          alwaysShowContent: true,
          formatter: '{a} <br/>{b}: {c} ({d}%)'
        },
        legend: {
          orient: 'vertical',
          x: 'right',
          data: ['在线', '离线', '未激活'],
          selectedMode: false,
          top: 40,
          formatter: function (name) {
            let legenTile = name + ': '
            for (let item of _data) {
              if (name === item.name) legenTile += item.value
            }
            return legenTile
          }
        },
        series: [
          {
            name: 'from',
            type: 'pie',
            radius: ['50%', '70%'],
            avoidLabelOverlap: false,
            hoverAnimation: false,
            textAlign: 'center',
            center: [120, 120],
            label: {
              normal: {
              	// 此处重点,设置为显示
                show: true,
                position: 'center',
                formatter: '{b}\n{c}',
                align: 'center',
                verticalAlign: 'middle',
                // 此处重点,字体大小设置为0
                textStyle: {
                  fontSize: '0'
                }
              },
              emphasis: {
                show: true,
                textStyle: {
                  fontSize: '20',
                  fontWeight: 'bold'
                },
                // 同步样式
                formatter: function (params) {
                  return `{tTitle|${params.name}}\n{tSubTitle|${params.value}}`
                },
                rich: {
                  tTitle: {
                    fontSize: '14',
                    fontWeight: 'bold',
                    lineHeight: '25'
                  },
                  tSubTitle: {
                    fontSize: '20',
                    fontWeight: 'bold',
                    lineHeight: '25'
                  }
                }
              }
            },
            labelLine: {
              normal: {
                show: false
              }
            },
            data: _data
          }
        ]
      }

      this.chart.setOption(options)

      this.chart.on('mouseover', { seriesName: 'from' }, params => {
        this.chart.setOption({
          title: {
            show: false
          }
        })
      })

      this.chart.on('mouseout', { seriesName: 'from' }, params => {
        this.chart.setOption({
          title: {
            show: true
          }
        })
      })
    }

更改后,显示效果如下:
在这里插入图片描述
鼠标悬浮高亮效果:
在这里插入图片描述
完成了预期效果,显示总数,鼠标移入显示当前选中数据,显示位置居中。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值