Bootstrap

在Vue项目中使用Echarts图表库

前言

ECharts是一款基于JavaScript的数据可视化图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。其使用方式颇为简单。

一、饼图

(1)【/src/views/Example/PieEchart.vue】

<template>
  <div style="padding: 100px; ">
    <div style="display: flex; flex: 1; width: 400px; height: 400px;">
      <div id="ScUcTcCoverageChart" style="width: auto; height: auto; flex: 1; border: 1px solid #dcdfe6;"></div>
    </div>
  </div>
</template>

<script setup>
import { h, onMounted, onUnmounted, getCurrentInstance, reactive } from 'vue'
import * as echarts from 'echarts'

/**
 * 英雄熟练度
 */
const heroProficiency = reactive({
  list: [],
})
/**
 * 查询【英雄熟练度】数据
 */
const queryHeroProficiency = async () => {
  const res = {
    success: true,
    msg: '请求成功',
    data: [
      { name: '赵怀真', value: 51, victoryRate: '72%' },
      { name: '云缨', value: 25, victoryRate: '68%' },
      { name: '庄周', value: 10, victoryRate: '85%' },
      { name: '后羿', value: 15, victoryRate: '51%' },
    ]
  }
  if (res.success) {
    heroProficiency.list = res.data
  } else {
    proxy.$message({ message: res.msg, type: 'error', duration: 3000 })
  }

  handleInitHeroProficiencyChart()
}
/**
 * 实例化【英雄熟练度】饼图
 * 详情见:https://echarts.apache.org/examples/zh/index.html#chart-type-bar
 */
const handleInitHeroProficiencyChart = async () => {
  const chartDom = await document.getElementById('ScUcTcCoverageChart')
   
  // 销毁
  echarts.dispose(chartDom)
  // 实例化
  const myChart = echarts.init(chartDom)
  const option = {
    title: {
      text: '英雄熟练度',
      left: 'center',
      top: 5, // 修改标题高度
      textStyle: {
        color: '#999',
        fontWeight: 'normal',
        fontSize: 13
      }
    },
    tooltip: {
      trigger: 'item', // 可选值为'item'和'axis',默认为'item',表示鼠标悬浮在数据项上时触发tooltip,'axis'表示鼠标悬浮在坐标轴上时触发tooltip
      show: true, // 控制鼠标悬浮是否显示数据
      textStyle: {
        fontSize: 12,
        fontWeight: 'normal'
      }
    },
    legend: {
      orient: 'vertical', // 可选值为'horizontal'(水平布局)和'vertical'(垂直布局)
      top: 30, // 调整位置
      left: '0%', // 距离右侧位置
      icon: 'circle', // 修改小图标为圆形
      itemHeight: 12, // 修改圆形小图标的大小
      textStyle: {
        fontSize: 12, // 可控制每个legend项的间距
        color: "#828282",
        rich: {
          tag_one: {
            width: 60,
            color: '#000',
            fontSize: 12,
          },
          tag_two: {
            width: 40,
            color: '#333',
            fontSize: 12,
          },
          tag_three: {
            color: '#686868',
            fontSize: 12,
          },
        },
      },
      formatter: (name) => {
        let target
        for (let i = 0; i < heroProficiency.list.length; i++) {
          if (heroProficiency.list[i].name == name) {
            target = heroProficiency.list[i]
          }
        }
        return `{tag_one|${target.name}} {tag_two|${target.value}个} {tag_three|${target.victoryRate}}`
      },
    },
    color: ['#5470c6', '#91cc75', '#73c0de'], // 控制圆环图的颜色
    series: [
      {
        type: 'pie',
        radius: ['15%', '25%'], // 圆环分为内径和外径,就是两个半径不一样的饼图可组成一个圆环图,radius数组中的两项分别为内径和外径(相对画布的百分比),或者直接一个圆'30%'
        center: ['50%', '55%'], // 调整圆环图位置
        labelLine: {
          length: 20, // 牵引线高度
        },
        label: {
          alignTo: 'edge',
          formatter: (item) => {
            const str = `{a|${item.data.name}}\n{hr|}\n  {b|${item.data.value}场} 丨 {per|${item.data.victoryRate}}  `
            return str
          },
          minMargin: 20, // 最小外边距
          edgeDistance: 10, // 贴边距离
          backgroundColor: '#fff',
          borderColor: '#dcdfe6',
          borderWidth: 1,
          borderRadius: 4,
          rich: {
            a: {
              padding: [5, 20],
              color: '#000',
              align: 'center'
            },
            hr: {
              width: '100%',
              height: 1,
              backgroundColor: '#dcdfe6',
            },
            b: {
              color: '#000',
              fontSize: 12,
              lineHeight: 25,
              align: 'center'
            },
            per: {
              color: '#fff',
              backgroundColor: '#4C5058',
              padding: [4, 4, 3, 4],
              borderRadius: 4,
              lineHeight: 25,
              align: 'center'
            }
          }
        },
        data: heroProficiency.list,
        avoidLabelOverlap: true, // 防止牵引线堆叠挤在一块
        itemStyle: {
          emphasis: {
            opacity: 0.9
          }
        }
      }
    ]
  }

  // 点击事件
  myChart.on('click', function (params) {
    console.log(params);
  })
  option && myChart.setOption(option)
}

onMounted(() => {
  queryHeroProficiency()
})

onUnmounted(() => {
  // ...
})
</script>

<style lang="less" scoped>

</style>

(2)运行效果

;