echarts饼图显示设置效果及代码示例

 更新时间:2026年05月22日 10:05:05   作者:hang_bro  
饼图主要是通过扇形的弧度表现不同类目的数据在总和中的占比,它的数据格式比柱状图更简单,只有一维的数值,不需要给类目,这篇文章主要介绍了echarts饼图显示设置效果及代码示例的相关资料,需要的朋友可以参考下

上图

这是最终显示效果

代码

<template>
  <div class="w-full h-full py-[10px] px-[20px] flex flex-col gap-[10px]">
    <!-- 上 -->
    <div class="flex flex-col flex-1 bg-white rounded-[6px] px-[18px] py-[20px] shadow-[0px_0px_8px_rgba(0,0,0,0.16)]">
      <div class="flex items-center">
        <img src="@/assets/images/layout/yunhe/dashboard_title.png" class="w-[4px] h-[16px] mr-[10px]" alt="" />
        <h2 class="text-[18px] font-bold">单位汇总</h2>
      </div>
      <div class="flex-1 flex">
        <!-- 左 -->
        <div class="flex-1 flex flex-col items-center justify-center" style="border-right: 2px dashed #dfdfdf">
          <div
            class="flex items-end text-[20px] h-[51px] text-[#1e1e1e] w-[510px] bg-[url('@/assets/images/layout/yunhe/dashboard_top_bg.png')] bg-no-repeat bg-bottom bg-size-[510px_24px]"
          >
            <img
              src="@/assets/images/layout/yunhe/dashboard_top_left.png"
              class="w-[77px] h-[51px] ml-[67px] mr-[27px]"
              alt=""
            />
            <div class="mb-[5px]">
              <span>频繁停电用户数</span>
              <span class="font-bold ml-[31px] mr-[27px] text-[#08a279] text-[24px]">6000</span>
              <span>户</span>
            </div>
          </div>
          <div ref="leftPieChartRef" class="flex-1 w-full flex items-center justify-center"></div>
        </div>
        <!-- 右 -->
        <div class="flex-1 flex flex-col items-center justify-center">
          <div
            class="flex items-end text-[20px] h-[51px] text-[#1e1e1e] w-[510px] bg-[url('@/assets/images/layout/yunhe/dashboard_top_bg.png')] bg-no-repeat bg-bottom bg-size-[510px_24px]"
          >
            <img
              src="@/assets/images/layout/yunhe/dashboard_top_right.png"
              class="w-[77px] h-[51px] ml-[67px] mr-[27px]"
              alt=""
            />
            <div class="mb-[5px]">
              <span>昨日发生停电户数</span>
              <span class="font-bold ml-[31px] mr-[27px] text-[#08a279] text-[24px]">6000</span>
              <span>户</span>
            </div>
          </div>
          <div ref="rightPieChartRef" class="flex-1 w-full flex items-center justify-center">1</div>
        </div>
      </div>
    </div>
   
    </div>
    <!--  -->
  </div>
</template>
<script lang="ts" setup>
import { useEcharts, EchartsOption } from '@/hooks/useEcharts'
import { useEchartsOption } from '@/hooks/useEchartsOption'
import dashboardPieBg from '@/assets/images/layout/yunhe/dashboard_pie_bg.png'
import * as echarts from 'echarts'
const tableData = ref<any[]>([])
const chartData = ref<any[]>([])
const loading = ref(false)
const barChartRef = ref()
const leftPieChartRef = ref()
const rightPieChartRef = ref()


const getLeftPieOption = (): EchartsOption => {
  return {
    color: ['#08a279', '#ff6600', '#50b9ef'],
    tooltip: {
      trigger: 'item',
    },

    graphic: [
      {
        type: 'image',
        left: 'center', //调整图片位置
        top: 'center', //调整图片位置
        z: -10, //确保图片在饼图下方
        //设置图片样式
        style: {
          image: dashboardPieBg,
          width: 280 * 1.3, // 图片宽度
          height: 226 * 1.3, // 图片高度
        },
      },
    ],

    series: [
      {
        type: 'pie',
        radius: ['55%', '60%'],
        center: ['50%', '50%'],
        avoidLabelOverlap: false,
        itemStyle: {
          borderRadius: 50,
          borderColor: '#fff',
          borderWidth: 1,
        },
        label: {
          show: true,
          fontSize: 16,
          color: '#1e1e1e',
          verticalAlign: 'middle',
          // 启用富文本(关键配置)
          rich: {
            // 定义名称样式
            text: {
              fontSize: 14,
              color: '#1e1e1e',
              padding: [5, 5, 5, 0], // 上右下左内边距
              align: 'left', // 富文本内部左对齐
            },
            textRight: {
              fontSize: 14,
              color: '#1e1e1e',
              padding: [5, 5, 5, 0], // 上右下左内边距
              align: 'right', // 富文本内部右对齐
            },
            // 2次
            count2: {
              fontSize: 17,
              fontWeight: 'bold',
              color: '#08a279',
              align: 'left', // 统一左对齐
            },
            // 3-8次
            count3to8: {
              fontSize: 17,
              fontWeight: 'bold',
              color: '#ff6600',
              align: 'left', // 补充左对齐,避免默认居中
            },
            // 8次以上
            count8More: {
              fontSize: 17,
              fontWeight: 'bold',
              color: '#50b9ef',
              align: 'left', // 补充左对齐
            },
          },
          // 重构 formatter:移除无效空标签,简化逻辑
          formatter: (params) => {
            // 统一获取样式名,简化逻辑
            let styleName = ''
            if (params.name == '2次') styleName = 'count2'
            else if (params.name == '3-8次') styleName = 'count3to8'
            else if (params.name == '8次以上') styleName = 'count8More'

            const content = `{${styleName}|${params.value}} {text|户} {${styleName}|${params.percent}} {text|%}`

            // 最终返回:名称换行 + 数值内容,无多余空标签
            return `{${params.name == '2次' ? 'textRight' : 'text'}|${params.name}}\n${content}`
          },
        },
        labelLine: {
          show: true,
          length: 20,
          length2: 130,
          // smooth: true,
          lineStyle: {
            color: '#dfdfdf',
            width: 1.5,
          },
        },
        labelLayout: function (params: any) {
          const isLeft = params.labelRect.x < leftPieChartInstance.value.getWidth() / 2
          const points = params.labelLinePoints
          // Update the end point.
          points[2][0] = isLeft ? params.labelRect.x : params.labelRect.x + params.labelRect.width
          return {
            labelLinePoints: points,
          }
        },
        data: [
          { value: 3000, name: '2次' },
          { value: 2000, name: '3-8次' },
          { value: 1000, name: '8次以上' },
        ],
      },
    ],
  }
}

const { instance: leftPieChartInstance } = useEcharts(leftPieChartRef, getLeftPieOption())

const getList = () => {
  loading.value = true
  tableData.value = Array.from({ length: 40 }, (_, index) => ({
    gdsName: `供电所${index + 1}`,
    twoTimes: `${index * 100}`,
    threeToEightTimes: `${index * 200}`,
    eightTimesMore: `${index * 300}`,
    threeTimesMoreRatio: `${index * 400}`,
  }))

  loading.value = false
}
const getChartData = () => {
  chartData.value = [
    { value: 16, name: '一级预警' },
    { value: 27, name: '二级预警' },
    { value: 38, name: '三级预警' },
    { value: 22, name: '四级预警' },
  ]
  barChartInstance.value?.setOption(getBarOption())
}
const getLeftPieChartData = () => {}

onMounted(() => {
  getList()

  getLeftPieChartData()
})
</script>
<style lang="scss" scoped></style>

记录一下

总结

到此这篇关于echarts饼图显示设置效果及代码示例的文章就介绍到这了,更多相关echarts饼图显示设置内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JavaScript 字符串常用操作小结(非常实用)

    JavaScript 字符串常用操作小结(非常实用)

    这篇文章主要介绍了JavaScript 字符串常用操作的知识,包括字符串截取,查找类的方法,对js字符串操作相关知识感兴趣的朋友一起学习吧
    2016-11-11
  • Vue+ElementUI实现文件照片音频视频预览功能

    Vue+ElementUI实现文件照片音频视频预览功能

    这篇文章主要介绍了JavaScript代码实现微博批量取消关注功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • ECharts异步加载数据与数据集(dataset)

    ECharts异步加载数据与数据集(dataset)

    这篇文章介绍了ECharts异步加载数据与数据集(dataset),文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • 取消Bootstrap的dropdown-menu点击默认关闭事件方法

    取消Bootstrap的dropdown-menu点击默认关闭事件方法

    今天小编就为大家分享一篇取消Bootstrap的dropdown-menu点击默认关闭事件方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08
  • 详解JavaScript如何实现一个简易的Promise对象

    详解JavaScript如何实现一个简易的Promise对象

    Promise对象的作用将异步操作以同步操作的流程表达出来,避免层层嵌套的回调函数,而且Promise提供了统一的接口,使得控制异步操作更加容易。本文介绍了如何实现一个简单的Promise对象,需要的可以参考一下
    2022-11-11
  • 全面了解函数声明与函数表达式、变量提升

    全面了解函数声明与函数表达式、变量提升

    下面小编就为大家带来一篇全面了解函数声明与函数表达式、变量提升。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • 利用JS自动打开页面上链接的实现代码

    利用JS自动打开页面上链接的实现代码

    今天经过测试,实现了利用JS来自动打开页面上的链接的功能,其实比较简单,就是在页面上把链接列表列出来,然后通过JQuery的相关控制,在框架页中把链接打开,具体能做什么用,大家自己想,哈哈。
    2011-09-09
  • 一文详解HTML文件中CSS文件和JS文件的加载顺序会阻塞页面渲染吗

    一文详解HTML文件中CSS文件和JS文件的加载顺序会阻塞页面渲染吗

    CSS和JS都会阻塞页面的关键渲染路径,不同情况下阻塞效果不同,这篇文章主要介绍了HTML文件中CSS文件和JS文件的加载顺序会不会阻塞页面渲染的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-12-12
  • JavaScript实现雪花飘落效果

    JavaScript实现雪花飘落效果

    这篇文章主要为大家详细介绍了JavaScript实现雪花飘落效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • 用于节点操作的API,颠覆原生操作HTML DOM节点的API

    用于节点操作的API,颠覆原生操作HTML DOM节点的API

    敏捷开发是一种以人为核心、迭代、循序渐进的开发方法。在敏捷开发中,软件项目的构建被切分成多个子项目,各个子项目的成果都经过测试,具备集成和可运行的特征。
    2010-12-12

最新评论