Echarts开发小技巧

Echarts开发小技巧

格式化数字,三个数字一个逗号

export function parseNumber(num) {
    try {
        let newNum = parseInt(num)
        return newNum.toLocaleString()
    } catch (error) {
        return 0
    }
}

环形图添加百分比显示

在 series 中添加如下代码表示在页面上会显示百分比

Snipaste_2022-05-07_17-19-57.png

label: {
    formatter(val) {
        return `${val.name} ${parseNumber(val.value)} (${val.percent}%)`
    }
}

在 tooltip 中添加如下代码,会在鼠标悬浮上去时显示百分比,其中 val.marker 表示每个颜色小圆点

Snipaste_2022-05-07_17-21-26.png

formatter(val) {
    return `${val.marker}${val.name} ${parseNumber(val.value)} (${val.percent}%)`
}

图示

Snipaste_2022-05-07_17-23-46.png

设置柱状图的x轴位置倾斜

在 xAxis 中添加如下代码即可实现文字倾斜,在文字过长时使用

Snipaste_2022-05-07_17-28-50.png

axisLabel: {
    rotate: 20 // 倾斜30度
}

图示

Snipaste_2022-05-07_17-30-58.png

修改环形图圆环大小

在 series 中添加 radius,第一个数字表示中心圆的大小,数字越大,中心的圆越大。第二个数字表示环形图本身的大小

Snipaste_2022-05-07_17-36-39.png

图示

Snipaste_2022-05-07_17-38-59.png

Snipaste_2022-05-07_17-40-07.png

x轴数据过长时显示滚动条

和 xAxis 平级添加如下代码即可实现滚动条

Snipaste_2022-05-07_17-32-59.png

dataZoom: [
    {
        type: 'slider',
        realtime: true,
        start: 0,
        end: 40, // 数据窗口范围的结束百分比。范围是:0 ~ 100。
        height: 20, // 组件高度
        left: 5, // 左边的距离
        right: 5, // 右边的距离
        bottom: 10, // 下边的距离
        show: true, // 是否展示
        fillerColor: 'rgba(17, 100, 210, 0.42)', // 滚动条颜色
        borderColor: 'rgba(17, 100, 210, 0.12)',
        handleSize: 0, // 两边手柄尺寸
        showDetail: false, // 拖拽时是否展示滚动条两侧的文字
        zoomLock: true, // 是否只平移不缩放
        moveOnMouseMove: false // 鼠标移动能触发数据窗口平移
        // zoomOnMouseWheel: false, //鼠标移动能触发数据窗口缩放
    },
    {
        type: 'inside', // 支持内部鼠标滚动平移
        start: 0,
        end: 40,
        zoomOnMouseWheel: false, // 关闭滚轮缩放
        moveOnMouseWheel: true, // 开启滚轮平移
        moveOnMouseMove: true // 鼠标移动能触发数据窗口平移
    }
],

图示

Snipaste_2022-05-07_17-33-42.png

添加局部Loading

首先封装 loading.js

import Vue from 'vue'
 
// loading框设置局部刷新,且所有请求完成后关闭loading框
let loading
let needLoadingRequestCount = 0 // 声明一个对象用于存储请求个数
function startLoading (targetdq) {
  loading = Vue.prototype.$loading({
    lock: true,
    text: '', // 显示的loading文字
    background: 'rgba(255,255,255,.4)',
    target: document.querySelector(targetdq) // 设置加载动画区域
  })
}
 
function endLoading () {
    loading.close()
}
export function showLoading (targetdq) {
  if (needLoadingRequestCount === 0) {
    startLoading(targetdq)
  }
  needLoadingRequestCount++
}
export function hideLoading () {
  if (needLoadingRequestCount <= 0) return
  needLoadingRequestCount--
  if (needLoadingRequestCount === 0) {
    endLoading()
  }
}
 
export default {
  showLoading,
  hideLoading
}

然后导出使用

import { showLoading, hideLoading } from '../../../utils/loading'

showLoading('.b-white')

setTimeout(() => {
    hideLoading()
}, 2000);

效果

Snipaste_2022-05-07_17-42-33.png

设置数据的最大值,不让柱状图直接顶到头

在 xAxis 中设置 max,放置柱状图直接订到头,不好看

Snipaste_2022-05-07_17-45-38.png

效果:

Snipaste_2022-05-07_17-47-09.png

上图中左右对比图的实现代码

<template>
  <div class="card b-white" style="height: 950px">
    <p class="chart-title">{{ title }}</p>
    <Echarts class="chart-pane" height="95%" :dom-id="domId" :options="data" />
  </div>
</template>
<script>
import Echarts from '@/components/Echarts'
import { getCustomerDistributionInfo } from '@/api/report'
import { showLoading, hideLoading } from '../../../utils/loading'
export default {
  components: { Echarts },
  props: ['year'],
  data() {
    return {
      title: `客户分布情况;左${this.year},右${this.year - 1}`,
      type: '',
      domId: Math.random(),
      data: {}
    }
  },
  watch: {
    year(val) {
      this.getData()
    }
  },
  mounted() {
    this.getData()
  },
  methods: {
    getData() {
      showLoading('.b-white')
      getCustomerDistributionInfo().then((res) => {
        hideLoading()
        console.log(res.data.rows)
        const data2022 = []
        const data2021 = []
        // 右边的图
        res.data.rows.right.forEach((item, index) => {
          data2021.push({
            name: item.name,
            type: 'bar',
            stack: 'Total' + index,
            barWidth: '15',
            label: {
              show: true,
              position: 'inside'
            },
            emphasis: {
              focus: 'series'
            },
            data: item.data
          })
        })
        // 左边的图
        res.data.rows.left.forEach((item, index) => {
          data2022.push({
            name: item.name,
            type: 'bar',
            stack: 'Total' + index,
            label: {
              show: true,
              position: 'inside',
              formatter(value) {
                if (value.data < 0) {
                  return -value.data
                }
              }
            },
            emphasis: {
              focus: 'series'
            },
            data: item.data.map((i) => i * -1)
          })
        })

        const that = this

        this.data = {
          tooltip: {
            trigger: 'axis',
            axisPointer: {
              type: 'shadow'
            },
            formatter(val) {
              return `
                
                ${that.year}<br>
                ${val[7].marker}${val[7].seriesName}\t
                ${val[7].value < 0 ? val[7].value * -1 : val[7].value}<br>
                ${val[8].marker}${val[8].seriesName}\t
                ${val[8].value < 0 ? val[8].value * -1 : val[8].value}<br>
                ${val[9].marker}${val[9].seriesName}\t
                ${val[9].value < 0 ? val[9].value * -1 : val[9].value}<br>
                ${val[10].marker}${val[10].seriesName}\t
                ${val[10].value < 0 ? val[10].value * -1 : val[10].value}<br>
                ${val[11].marker}${val[11].seriesName}\t
                ${val[11].value < 0 ? val[11].value * -1 : val[11].value}<br>
                ${val[12].marker}${val[12].seriesName}\t
                ${val[12].value < 0 ? val[12].value * -1 : val[12].value}<br>
                ${val[13].marker}${val[13].seriesName}\t
                ${val[13].value < 0 ? val[13].value * -1 : val[13].value}<br>
                ${that.year - 1}<br>
                ${val[0].marker}${val[0].seriesName}\t
                ${val[0].value < 0 ? val[0].value * -1 : val[0].value} <br>
                ${val[1].marker}${val[1].seriesName}\t
                ${val[1].value < 0 ? val[1].value * -1 : val[1].value} <br>
                ${val[2].marker}${val[2].seriesName}\t
                ${val[2].value < 0 ? val[2].value * -1 : val[2].value}<br>
                ${val[3].marker}${val[3].seriesName}\t
                ${val[3].value < 0 ? val[3].value * -1 : val[3].value}<br>
                ${val[4].marker}${val[4].seriesName}\t
                ${val[4].value < 0 ? val[4].value * -1 : val[4].value}<br>
                ${val[5].marker}${val[5].seriesName}\t
                ${val[5].value < 0 ? val[5].value * -1 : val[5].value}<br>
                ${val[6].marker}${val[6].seriesName}\t
                ${val[6].value < 0 ? val[6].value * -1 : val[6].value}
              `
            }
          },
          legend: {},
          grid: {
            left: '3%',
            right: '4%',
            bottom: '3%',
            containLabel: true
          },
          xAxis: [
            {
              type: 'value',
              max: (value) => {
                console.log(value) // value是包含数值最大最小值的对象
                return value.max + 2
              },
              min: (value) => {
                console.log(value) // value是包含数值最大最小值的对象
                return (value.max + 2) * -1
              },
              axisLabel: {
                // 把x轴的负数改成正数
                formatter(value) {
                  if (value < 0) {
                    return -value
                  } else {
                    return value
                  }
                }
              }
            }
          ],
          yAxis: [
            {
              type: 'category',
              axisTick: {
                show: false
              },
              data: [
                '0-50万',
                '50-100万',
                '100-300万',
                '300-500万',
                '500万以上'
              ]
            }
          ],
          series: [...data2021, ...data2022]
        }
      })
    }
  }
}
</script>
<style lang="scss" scoped>
.chart-title {
  font-size: 15px;
  padding: 10px;
  background: #fff;
}
.card {
  padding: 10px;
  background: white;
}
</style>

设置在柱状图中显示数字

在 series 中添加 position,表示数字的显示位置

 label: {
     show: true,
         position: 'top',
             color: 'black'
 }

效果

Snipaste_2022-05-07_17-51-24.png

设置图例分页

当图例过多时,会拥挤到一块不好看,我们通过让图例分页,只在一行展示

在 legend 中添加如下代码

type: 'scroll'

Snipaste_2022-05-07_17-53-59.png

效果:

Snipaste_2022-05-07_17-55-11.png

Snipaste_2022-05-07_17-55-42.png

posted @ 2022-05-07 17:59  Y-X南川  阅读(114)  评论(0编辑  收藏  举报