echarts 饼图 富文本图例

饼图组件 pie.vue

<template>
  <div class="pie" :style="{height:height,width:width}">

  </div>
</template>
<script>
import { mapState } from 'vuex'
// import echarts from 'echarts'
export default {
  computed:mapState({
    // 箭头函数可使代码更简练state
    scale: state =>state.overView.scale
  }),
  props:{
    title:{
      type: String,
    },
    initData:{
      type:Array,
      default:()=>{
          return []
      }
    },
    legendData: {
      type:Array,
      default:()=>{
          return []
      }
    },
    legend:{
      type:Array,
       default:()=>{
          return []
      }
    },
    height:{
       type: String,
       default:'100%'
    },
    color:{
      type:Array,
      default:()=>{
          return ['#4e84fe','#ecc04f','#fe4e77']
      }
    },
    width:{
       type: String,
       default:'100%'
    },
    autoResize: {
        type: Boolean,
        default: true
      },
  },
  data () {
    return {
      pieLengenFs: 12
    }
  },
  computed:{
    PieLegend(){
      let b = []
      this.initData.forEach(element => {
           b.push(element.name)
      });
      return b
    }
  },
  mounted () {
    let that =this
    that.chart = this.$echarts.init(this.$el);
    that.initChart();
    if (this.autoResize) {
       window.addEventListener('resize', this.__resizeHanlder)
    }
    // 监听侧边栏的变化
    const sidebarElm = document.getElementsByClassName('mainCont')[0] // 获取根节点的类名
    sidebarElm.addEventListener('transitionend', this.__resizeHanlder)

    // 获取当前浏览器的宽度
    
  },
  methods: {
    __resizeHanlder(){
       this.chart.resize()
       let win_width = document.body.clientWidth
      //  console.log('win_width', win_width)
       if (win_width < 1800) {
         this.pieLengenFs = 12
       } else {
         this.pieLengenFs = 14
       }
    },
    draw(param){
      let that =this
      this.chart.setOption({
            legend: {
              data:this.PieLegend
            },
            series: [
                {
                    name:this.title,
                    data:param
                }
              ]
        });
    },
    initChart(){
      let _this = this
      this.chart.setOption({
          // title:{
          //   text:this.title,
          //   left:'center',
          //   top:10,
          //   textStyle:{
          //     fontSize:14,
          //     fontWeight:300,
          //     fontFamily:'Microsoft YaHei',
          //     align:'center',
          //     color:'RGBA(98, 98, 102, 1)'
          //   }
          // },
          tooltip : {
              trigger: 'item',
              formatter: "{b} : {c} ({d}%)" // {a} <br/>
          },
          color:this.color,
          legend: {
            itemWidth: 10,
            itemHeight: 10,
            orient: 'vertical',
            right: 20,
            top: 'center',
            padding:[40, 0, 40, 0],
            itemGap: 10,
            data: this.PieLegend,
            textStyle: {
              rich:{
                  a:{
                      fontSize: this.pieLengenFs,
                      verticalAlign:'middle',
                      align:'center',
                      lineHeight:this.pieLengenFs,
                      padding:[0,6,0,0],
                      color: '#000'
                  },
                  b:{
                      fontSize: this.pieLengenFs,
                      align:'center',
                      padding:[0,6,0,0],
                      lineHeight:this.pieLengenFs,
                      color: '#000'
                  },
                  c: {
                      fontSize: this.pieLengenFs,
                      align:'center',
                      padding:[0,6,0,0],
                      lineHeight:this.pieLengenFs,
                      color: '#000'
                  },
                  d: {
                      fontSize: this.pieLengenFs,
                      color: '#000'
                  }
              }
            },
            formatter: function(name){
              // console.log(data)
              let data = _this.legendData
              let target = 0
              let target1 = ''
              let sum = 0
              for(var i=0; i< data.length; i++){
                  if(data[i].name == name){
                      target = data[i].value
                      target1 = data[i].value1
                  }
                  sum += data[i].value
              }
              let arr = [
                '{a|'+name+'}',
                // '{b|'+target+'}',
                // '{c|'+target1+'}',
                '{d|'+(sum>0?((target/sum)*100).toFixed(2):0)+'%}'
              ]
              return arr.join('')
            }
          },
          series: [
                {
                    name: '支付方式',
                    type: 'pie',
                    radius : ['40%', '70%'],
                    center: ['25%', '50%'],
                    selectedMode: 'single',
                    label: {
                       show:true,
                       normal: {
                            show: false,
                            position: 'center'
                        },
                    },
                    itemStyle: {
                      borderColor: '#fff',
                      borderWidth: 10,
                      emphasis: {
                        shadowBlur: 10,
                        shadowOffsetX: 0,
                        shadowColor: 'rgba(0, 0, 0, 0.5)'
                      },
                      normal:{
                        color: function(params) {
                          //自定义颜色
                          var colorList = [     
                              '#0080FF', '#0AD4D6', '#F54DB7', '#6C5CE7', '#AAB3C9',
                              '#0080FF', '#0AD4D6', '#F54DB7', '#6C5CE7', '#AAB3C9',
                              '#0080FF', '#0AD4D6', '#F54DB7', '#6C5CE7', '#AAB3C9',
                              '#0080FF', '#0AD4D6', '#F54DB7', '#6C5CE7', '#AAB3C9',
                          ]
                          return colorList[params.dataIndex]
                        }
                      }
                    },
                    labelLine: {
                        normal: {
                            show: false
                        }
                    },
                    data:[]
                }
              ]
          })
     }
  },
  data(){
    return {
      chart:null,
        label: {
           
        }
    }
  },
  watch:{
    initData:{ // 监听initDta,数据变化的时候,重新绘制饼图
      deep:true,
      handler (v, ov) {
        this.draw(v);
      }
      
    },
    scale(){
      this.__resizeHanlder()
    }
  }
}
</script>
<style lang="scss" scoped>

</style>

父组件调用

<div style="width:50%;height:300px;">
        <pie title="支付方式" :initData="initDataPayType" :legend="pieLegend" :legendData="legendData"></pie>
      </div>

<script>
import pie from './components/pie'
export default {
    components:{pie},
    mounted() {
       this.initDataPayType = [
      { value: 16, name: 'a' },
      { value: 73, name: 'b' },
      { value: 58, name: 'c' },
      { value: 48, name: 'd' },
      { value: 30, name: 'e' },
      { value: 16, name: 'f' },
      { value: 73, name: 'g' },
      { value: 58, name: 'h' },
      { value: 48, name: 'i' },
      { value: 30, name: 'j' },
      { value: 16, name: 'k2' },
      { value: 73, name: 'l2' },
      { value: 58, name: 'm2' },
      { value: 48, name: 'n2' },
      { value: 30, name: 'o2' },
      { value: 16, name: 'p3' },
      { value: 73, name: 'q3' },
      { value: 58, name: 'r3' },
      { value: 48, name: 's3' },
      { value: 30, name: 't3' }
    ]
    console.log('this.initDataPayType', this.initDataPayType)
    this.legendData = this.initDataPayType.map(item => {
      item.value1 = item.value
      return item
    })
    console.log('this.legendData', this.legendData)
    this.initDataPayType.forEach(e => {
        this.pieLegend.push(e.name)
    });
    }
        

}

</script>

 

示例:

 

 

 

initData
posted @ 2023-02-02 16:48  front-gl  阅读(369)  评论(0编辑  收藏  举报