vue3 + echarts 二次开发百分比饼图

效果图:

  • 安装  
pnpm i echarts
  • 公共模块组件
    <div
      class="pie"
      ref="percent"
      style="width: 100%; height: calc(100% - 48px)"
    ></div>
import { ref, onMounted } from 'vue'
import * as echarts from 'echarts'
const props = defineProps<{
  titlecolor: any // 中间百分比数字文字的颜色
  value: any // 值百分之多少
  valuesize: any // 值的大小
  color: any //  圆环颜色数组 渐变
}>()
let percent = ref<any>('')

// ---------------------------------
const Pie = () => {
  let dataArr = []
  for (var i = 0; i < 100; i++) {
    if (i % 10 === 0) {
      dataArr.push({
        name: (i + 1).toString(),
        value: 40,
        itemStyle: {
          // 外圈的点点颜色
          normal: {
            color: props.color[1],
            borderWidth: 0,
            // borderColor: '#00ff00'
          },
        },
      })
    } else {
      dataArr.push({
        name: (i + 1).toString(),
        value: 100,
        itemStyle: {
          normal: {
            color: 'rgba(0,0,0,0)',
            borderWidth: 0,
            borderColor: 'rgba(0,0,0,0)',
          },
        },
      })
    }
  }
  return dataArr
}

const Pie1 = () => {
  let dataArr = []
  for (var i = 0; i < 100; i++) {
    if (i % 5 === 0) {
      dataArr.push({
        name: (i + 1).toString(),
        value: 20,
        itemStyle: {
          normal: {
            color: props.color[1],
            borderWidth: 0,
            borderColor: 'rgba(0,0,0,0)',
          },
        },
      })
    } else {
      dataArr.push({
        name: (i + 1).toString(),
        value: 100,
        itemStyle: {
          normal: {
            color: 'rgba(0,0,0,0)',
            borderWidth: 0,
            borderColor: 'rgba(0,0,0,0)',
          },
        },
      })
    }
  }
  return dataArr
}

const Pie2 = () => {
  let dataArr = []
  for (var i = 0; i < 100; i++) {
    if (i % 5 === 0) {
      dataArr.push({
        name: (i + 1).toString(),
        value: 20,
        itemStyle: {
          normal: {
            color: props.color[1],
            borderWidth: 0,
            borderColor: 'rgba(0,0,0,0)',
          },
        },
      })
    } else {
      dataArr.push({
        name: (i + 1).toString(),
        value: 100,
        itemStyle: {
          normal: {
            color: 'rgba(0,0,0,0)',
            borderWidth: 0,
            borderColor: 'rgba(0,0,0,0)',
          },
        },
      })
    }
  }
  return dataArr
}

const Pie3 = () => {
  let dataArr = []
  for (var i = 0; i < 100; i++) {
    if (i % 10 === 0) {
      dataArr.push({
        name: (i + 1).toString(),
        value: 30,
        itemStyle: {
          normal: {
            color: props.color[1],
            borderWidth: 0,
            borderColor: 'rgba(0,0,0,0)',
          },
        },
      })
    } else {
      dataArr.push({
        name: (i + 1).toString(),
        value: 100,
        itemStyle: {
          normal: {
            color: 'rgba(0,0,0,0)',
            borderWidth: 0,
            borderColor: 'rgba(0,0,0,0)',
          },
        },
      })
    }
  }
  return dataArr
}

// ---------------------------------

const markChart = () => {
  // 初始化
  let Mychart = echarts.init(percent.value)
  // 配置项
  // 带分割线的圆环配置 start ------------------------------
  var labelData: any = []
  var labelData1: any = []
  for (var i = 0; i < 150; ++i) {
    labelData.push({
      value: 1,
      name: i,
      itemStyle: {
        normal: {
          color: '#696969',
        },
      },
    })
  }
  for (var i = 0; i < labelData.length; ++i) {
    if (labelData[i].name < 50) {
      labelData[i].itemStyle = {
        normal: {
          color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [
            {
              offset: 0,
              color: props.color[0],
            },
            {
              offset: 1,
              color: props.color[0],
            },
          ]),
        },
      }
    }
  }
  // ------------------------------

  let option = {
    // -- start 中间 百分比值样式属性
    title: [
      {
        text: props.value + '%', //动态传递
        x: '50%',
        y: '45%',
        textAlign: 'center',
        textStyle: {
          fontSize: props.valuesize,
          fontWeight: '700',
          color: props.titlecolor,
          textAlign: 'center',
        },
      },
    ],
    //  -- end
    polar: {
      center: ['50%', '50%'], //极坐标系的中心(圆心)坐标
      radius: ['75%', '85%'], // 极坐标系的半径,第一个为 内半径,第二个外半径标识可视区域
    },
    angleAxis: {
      // 角度轴
      max: 100, // 设置角度轴刻度的最大值
      show: false, // 是否显示
      startAngle: 0, // 设置角度轴起始刻度的角度 默认90度 即圆心正上方;0度为圆心的正右方
    },
    radiusAxis: {
      //径向轴
      type: 'category', // 类型:类目轴 必须通过data设置类目数据
      show: true,
    },
    series: [
      {
        name: '',
        type: 'bar',
        roundCap: true, // 是否在环形柱条两端显示成圆形
        barWidth: 40, //最外圈圆环宽度
        showBackground: true, // 是否显示环形柱条背景色
        backgroundStyle: {
          color: '#464451', // 环形柱条背景颜色
        },
        data: [props.value],
        coordinateSystem: 'polar', // 使用坐标系类型:[cartesian2d - 二维直角坐标系] [polar - 极坐标系]
        itemStyle: {
          normal: {
            color: new echarts.graphic.LinearGradient(1, 0, 0, 0, [
              {
                offset: 0.6,
                color: props.color[1],
              },
              {
                offset: 1,
                color: props.color[2],
              },
            ]),
          },
        },
      },
      {
        hoverAnimation: false,
        type: 'pie',
        z: 2,
        data: labelData,
        radius: ['52%', '59%'],
        zlevel: -2,
        itemStyle: {
          normal: {
            borderColor: '#1f1e26',
            borderWidth: 4,
          },
        },
        label: {
          normal: {
            position: 'inside',
            show: false,
          },
        },
      },
      {
        hoverAnimation: false,
        type: 'pie',
        z: 1,
        data: labelData1,
        radius: ['52%', '59%'],
        zlevel: -2,
        itemStyle: {
          normal: {
            borderColor: '#1f1e26',
            borderWidth: 4,
          },
        },
        label: {
          normal: {
            position: 'inside',
            show: false,
          },
        },
      },
      {
        type: 'pie',
        radius: ['42%', '45%'],
        center: ['50%', '50%'],
        data: [
          {
            hoverOffset: 1,
            value: props.value, //最内圈圆环
            name: '',
            itemStyle: {
              color: props.color[1],
            },
            label: {
              show: false,
            },
            labelLine: {
              normal: {
                smooth: true,
                lineStyle: {
                  width: 10,
                },
              },
            },
            hoverAnimation: false,
          },
          {
            label: {
              show: false,
            },
            labelLine: {
              normal: {
                smooth: true,
                lineStyle: {
                  width: 0,
                },
              },
            },
            value: 100 - props.value, //动态传递
            hoverAnimation: false,
            itemStyle: {
              color: '#3c3a48',
            },
          },
        ],
      },
      {
        type: 'pie',
        zlevel: 0,
        silent: true,
        radius: ['67%', '65.5%'],
        z: 1,
        label: {
          normal: {
            show: false,
          },
        },
        labelLine: {
          normal: {
            show: false,
          },
        },
        data: Pie(),
      },
      {
        type: 'pie',
        zlevel: 0,
        silent: true,
        startAngle: -150,
        radius: ['65%', '63.5%'],
        z: 1,
        label: {
          normal: {
            show: false,
          },
        },
        labelLine: {
          normal: {
            show: false,
          },
        },
        data: Pie3(),
      },
      {
        type: 'pie',
        zlevel: 0,
        silent: true,
        startAngle: -140,
        radius: ['68%', '66.5%'],
        z: 1,
        label: {
          normal: {
            show: false,
          },
        },
        labelLine: {
          normal: {
            show: false,
          },
        },
        data: Pie(),
      },
      {
        type: 'pie',
        zlevel: 0,
        silent: true,
        radius: ['61%', '60%'],
        z: 1,
        label: {
          normal: {
            show: false,
          },
        },
        labelLine: {
          normal: {
            show: false,
          },
        },
        data: Pie1(),
      },
      {
        type: 'pie',
        zlevel: 0,
        silent: true,
        startAngle: -140,
        radius: ['61%', '60%'],
        z: 1,
        label: {
          normal: {
            show: false,
          },
        },
        labelLine: {
          normal: {
            show: false,
          },
        },
        data: Pie2(),
      },
      {
        type: 'pie',
        zlevel: 0,
        silent: true,
        startAngle: -147.5,
        radius: ['61%', '60%'],
        z: 1,
        label: {
          normal: {
            show: false,
          },
        },
        labelLine: {
          normal: {
            show: false,
          },
        },
        data: Pie2(),
      },
    ],
  }
  // ------------------------------
  // 生成图表
  Mychart.setOption(option)
  window.onresize = function () {
    Mychart.resize()
  }
}
// -------------------------------
onMounted(() => {
  setTimeout(() => {
    markChart()
  }, 8)
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/679553.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaEE:http请求 | 过滤器 | 同步与异步请求 | 跨域问题 | axios框架 有这一篇就够!

&#x1f4c3;HTTP请求 ▐ http超文本传输协议&#xff1a; ⦁ http超文本传输协议属于应用层协议&#xff0c;传输内容必须是超文本内容 (网页内容) ⦁ 例如在网页上点击超链接&#xff0c;提交表单&#xff0c;都可以向后端发送一个http请求 ⦁ 一次http请求中包含请求行、…

盘点哪些企业容易被ddos攻击

DDoS&#xff08;分布式拒绝服务&#xff09;攻击已成为网络安全威胁中的重要一环。本文将探讨哪些类型的企业容易成为DDoS攻击的目标&#xff0c;并提出相应的防范策略&#xff0c;帮助企业更好地保护自身网络安全。 一、电子商务平台 电子商务平台作为线上交易和支付的重要场…

Direct local .aar file dependencies are not supported when building an AAR.

最近升级了最新的AndroidStdio版本&#xff0c;然后导入之前的安卓工程 然后经过一番折腾后项目可以跑了&#xff0c;但是意外发现出release包的时候报错了&#xff0c; Direct local .aar file dependencies are not supported when building an AAR. 网上有很多解决方法&am…

鸿蒙HarmonyOS实战—如何使用Video组件播放视频

1.视频播放 鸿蒙系统中&#xff0c;关于视频播放&#xff0c;可以使用上层视频组件Video。 参数如下 src 支持file:///data/storage路径前缀的字符串&#xff0c;用于读取应用沙箱路径内的资源。需要保证目录包路径下的文件有可读权限。 说明&#xff1a;视频支持的格式是&am…

opencv-python(四)

读取图像文件 image cv2.imread(path, flag) flag&#xff1a;1. 默认值&#xff0c;依原图像读取图像&#xff0c;保留Alpha透明度通道。2.IMREAD_GRAYSCALE&#xff1a;将图像转为灰度再读取。3.IMREAD_COLOR&#xff1a;将图像转为三通道BGR彩色再读取。 可读取的图像格…

猫头虎分享已解决Bug || Error: ‘fetch‘ is not defined

原创作者&#xff1a; 猫头虎 作者微信号&#xff1a; Libin9iOak 作者公众号&#xff1a; 猫头虎技术团队 更新日期&#xff1a; 2024年6月6日 博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &…

HBuildX创建uni-app项目

新建项目 输入项目名称&#xff0c;选择存放位置、项目模板、vue版本 创建成功后左边会显示项目目录 安装插件&#xff1a;工具-》插件安装&#xff0c;根据所选vue版本安装编译器 点击运行&#xff0c;选择你需要运行的地方即可

Java面试题:ArrayList底层实现原理、HashMap的实现原理、HashMap的jdk1.7和jdk1.8有什么区别

文章目录 一、List相关面试题1.1 ArrayList源码分析&#xff08;底层实现&#xff09;1.2 ArrayList底层的实现原理是什么1.3 ArrayList listnew ArrayList(10)中的list扩容几次1.4 如何实现数组和List之间的转换1.5 ArrayList 和 LinkedList 的区别是什么 二、HashMap相关面试…

[协议]TCP协议

TCP,UDP协议工作在传输层 TCP基于连接&#xff1b; UDP基于非连接 TCP三次握手 UDP:不能保证丢包&#xff0c;传输稳定性不如TCP;

【SVG 生成系列论文(十一)】如何定制化地生成 SVG 图案?Text-Guided Vector Graphics Customization

SVG 生成系列论文&#xff08;一&#xff09; 和 SVG 生成系列论文&#xff08;二&#xff09; 分别介绍了 StarVector 的大致背景和详细的模型细节。SVG 生成系列论文&#xff08;三&#xff09;和 SVG 生成系列论文&#xff08;四&#xff09;则分别介绍实验、数据集和数据增…

《2024年DDoS趋势报告》:DDoS攻击规模飙升233.33%

2023年&#xff0c;数字领域面临着分布式拒绝服务&#xff08;DDoS&#xff09;攻击的变革浪潮&#xff0c;攻击速度创纪录地达到了每秒700 Gbps和8000万数据包。这些事件跨越了从游戏到金融服务的各个行业&#xff0c;突显了DDoS是一种普遍存在的风险。 值得注意的是&#xf…

关于家储用防逆流电流互感器AKH-0.66/K K-φ16 100A/40mA详细介绍-安科瑞 蒋静

1.产品特点 产品外形美观&#xff0c;安装、接线方便&#xff0c;专用于通讯机房 100A 及以下配电系统改造&#xff0c;可与 AMC16 多回路监控仪表配合使用。 2.型号说明 3.外形尺寸(公差&#xff1a;2mm) 4.规格参数对照表 5.使用环境 &#xff08;1&#xff09;额定工作…

2024年能源、电力电气与机电工程国际学术会议(ICEPEME 2024)

全称&#xff1a;2024年能源、电力电气与机电工程国际学术会议&#xff08;ICEPEME 2024&#xff09; 2024 International Conference on Civil Engineering and Architectural Planning 会议网址:http://www.icepeme.com会议时间&#xff1a;2024/7/10截稿时间&#xff1a;20…

【传知代码】时序预测:多头注意力+宽度学习(论文复现)

前言&#xff1a;近年来&#xff0c;随着人工智能技术的飞速发展&#xff0c;尤其是深度学习领域的突破&#xff0c;时序预测领域也迎来了新的变革。传统的预测方法&#xff0c;如线性回归、时间序列分析等&#xff0c;虽然在某些场景下表现良好&#xff0c;但在面对复杂、非线…

FPGA - 4位数值比较器电路

4位数值比较器电路 描述 某4位数值比较器的功能表如下。 请用Verilog语言采用门级描述方式&#xff0c;实现此4位数值比较器 输入描述&#xff1a; input [3:0] A , input [3:0] B 输出描述&#xff1a; output wire…

嵌入式科普(20)2024瑞萨技术交流日

没有来参加技术交流日的一天&#xff0c;可能就是决定一生的一天。 分享2024瑞萨技术交流日MVP结算画面&#xff1a; 强烈建议点击b站小程序&#xff0c;听背景音乐&#xff0c;感受九子夺嫡结算MVP&#xff0c;四爷王上加白。从此以后写代码再也不出bug 嵌入式科普(20)2024瑞…

深度学习-07-反向传播的自动化

深度学习-07-反向传播的自动化 本文是《深度学习入门2-自製框架》 的学习笔记&#xff0c;记录自己学习心得&#xff0c;以及对重点知识的理解。如果内容对你有帮助&#xff0c;请支持正版&#xff0c;去购买正版书籍&#xff0c;支持正版书籍不仅是尊重作者的辛勤劳动&#xf…

解决 clickhouse jdbc 偶现 failed to respond 问题

背景 Clickhouse集群版本为 Github Clickhouse 22.3.5.5&#xff0c; clickhouse-jdbc 版本为 0.2.4。 问题表现 随着业务需求的扩展&#xff0c;基于Clickhouse 需要支持更多任务在期望的时效内完成&#xff0c;于是将业务系统和Clickhouse交互的部分都提交给可动态调整核心…

Python中如何打开网页

幸好思念无声&#xff0c;可惜思念无声 ——24.6.4 Python打开前端网页 1.导入webbrowser库 用webbrowser.open(传入网址)&#xff0c;打开网页 import webbrowser webbrowser.open("Index.html") 2.用flask框架 from wsgiref.simple_server import make_serve…

九、从0开始卷出一个新项目之瑞萨RZN2L生产烧录固件(jflash擦写读外挂flash)

目录 七、生产烧录固件(jflash擦/写/读外挂flash) 7.1 flash母片读写 7.2 jflash擦/写/读外挂flash 九、从0开始卷出一个新项目之瑞萨RZN2L 七、生产烧录固件(jflash擦写读外挂flash) 七、生产烧录固件(jflash擦/写/读外挂flash) 7.1 flash母片读写 略 7.2 jflash擦/写/读…