echarts绘制一个环形图2

news2024/11/19 5:57:42

其他echarts:

echarts绘制一个环形图

echarts绘制一个柱状图,柱状折线图

echarts绘制一个饼图 

效果:

组件代码:

<template>
  <div class="wrapper">
    <div ref="doughnutChart2" id="doughnutChart2"></div>
  </div>
</template>

<script>
export default {
  mixins: [],
  components: {},
  props: {
    table: {
      type: Object,
      default: {
        datas: {},
        color: [],
      },
    },
    hollowOut: {
      //是否中空
      type: Boolean,
      default: false,
    },
  },
  data() {
    return {
      limitLength: 7, //显示name长度
      showTotalNum: false, //是否显示总数
      totalNum: 0, //总数
    };
  },
  created() {},
  mounted() {},
  watch: {
    table: {
      handler(newVal) {
        if (newVal) {
          // 进行数据处理操作
          if (newVal.limitLength) this.limitLength = newVal.limitLength;
          //计算总数
          if (newVal.showTotalNum) {
            this.showTotalNum = newVal.showTotalNum;
            this.totalNum = this.calculatePropertySum(newVal.datas, "VALUE");
          }
          const generateRandomColor = () => {
            var r = Math.floor(Math.random() * 201); // 随机生成红色通道值(0-200)
            var g = Math.floor(Math.random() * 255); // 随机生成绿色通道值(0-200)
            var b = Math.floor(Math.random() * 201); // 随机生成蓝色通道值(0-200)

            let hex =
              "#" + componentToHex(r) + componentToHex(g) + componentToHex(b);
            return hex;
          };
          const componentToHex = (c) => {
            let hex = c.toString(16);
            return hex.length == 1 ? "0" + hex : hex;
          };
          newVal.datas.map((item, index) => {
            if (!newVal.color[index]) {
              let a = generateRandomColor();
              newVal.color.push(a);
            }
          });
          setTimeout(() => {
            this.init();
          });
        }
      },
    },
  },
  methods: {
    init() {
      let option = {
        tooltip: {
          trigger: "item",
          formatter: "{b} : {c} ({d}%)",
        },
        title: [
          {
            show: this.showTotalNum,
            text: this.totalNum,
            left: this.$common.adjustOffset(
              this.totalNum,
              this.table.legendLocation == "left" ? "65%" : "47.5%",
              this.table.legendLocation == "left" ? "48%" : "42%"
            ).adjustedLeft,
            top: this.$common.adjustOffset(
              this.totalNum,
              this.table.legendLocation == "left" ? "65%" : "47.5%",
              this.table.legendLocation == "left" ? "48%" : "42%"
            ).adjustedTop,
            textStyle: {
              color: "#333333",
              fontSize: "22",
              fontWeight: "600",
              textAlign: "center", // 设置标题居中对齐
            },
          },
          {
            show: this.showTotalNum,
            text: "总计",
            left: this.$common.adjustOffset(
              "总计",
              this.table.legendLocation == "left" ? "65%" : "47.5%",
              this.table.legendLocation == "left" ? "33%" : "29.5%"
            ).adjustedLeft,
            top: this.$common.adjustOffset(
              "总计",
              this.table.legendLocation == "left" ? "65%" : "47.5%",
              this.table.legendLocation == "left" ? "33%" : "29.5%"
            ).adjustedTop,
            textStyle: {
              color: "#333333",
              fontSize: "12",
              fontWeight: "500",
              textAlign: "center", // 设置标题居中对齐
            },
          },
        ],
        //颜色注释显示的位置
        legend: {
          orient:
            this.table.legendLocation == "left" ? "vertical" : "horizontal",
          type: "scroll", //颜色过多可以滚动
          left: this.table.legendLocation == "left" ? 0 : "center",
          top: this.table.legendLocation == "left" ? "top" : "bottom",
          icon: this.table.legendIcon ? "circle" : "",
          formatter: (name) => {
            let seriesData = option.series[1].data; // 数据在series的第几个中
            let total = 0;
            for (let i = 0; i < seriesData.length; i++) {
              total += seriesData[i].value;
            }
            for (let j = 0; j < seriesData.length; j++) {
              if (name === seriesData[j].name) {
                let percent = ((seriesData[j].value / total) * 100).toFixed(2);
                if (name.length > this.limitLength) {
                  return (
                    name.substring(0, this.limitLength) +
                    "..." +
                    " " +
                    seriesData[j].value +
                    " " +
                    percent +
                    "%"
                  );
                } else {
                  return name + " " + seriesData[j].value + " " + percent + "%";
                }
              }
            }
          },
        },
        series: [
          // {
          //   type: "pie",
          //   radius: ["39%", "41%"],
          //   center: ["67%", "50%"],
          //   avoidLabelOverlap: false,
          //   label: {
          //     show: false,
          //     position: "center",
          //   },
          //   emphasis: {
          //     label: {
          //       show: true,
          //       fontSize: "30",
          //       fontWeight: "bold",
          //     },
          //   },
          //   labelLine: {
          //     show: false,
          //   },
          //   data: [
          //     {
          //       value: 1,
          //       name: undefined,
          //       itemStyle: {
          //         color: new this.$E.graphic.LinearGradient(0, 0, 0, 1, [
          //           { offset: 0, color: "rgba(255, 255, 255, 0)" },
          //           { offset: 0.24, color: "rgba(153, 140, 255, 1)" },
          //           { offset: 0.5, color: "rgba(117, 104, 255, 1)" },
          //           { offset: 0.24, color: "rgba(153, 140, 255, 1)" },
          //           { offset: 1, color: "rgba(255, 255, 255, 0)" },
          //         ]),
          //       },
          //       hoverAnimation: false,
          //     },
          //   ],
          //   graphic: [
          //     {
          //       type: "path",
          //       shape: {
          //         cx: 0.5,
          //         cy: 0.5,
          //         r: "15%",
          //       },
          //       style: {
          //         fill: "none",
          //         stroke: "purple",
          //       },
          //     },
          //   ],
          // },
          {
            color: ["#163d59"],
            type: "gauge",
            center:
              this.table.legendLocation == "left"
                ? ["67%", "50%"]
                : ["50%", "40%"],
            startAngle: 150,
            endAngle: -209.999,
            splitNumber: 7,
            radius: this.table.legendLocation == "left" ? "80%" : "60%",
            pointer: {
              show: false,
            },
            progress: {
              show: false,
              roundCap: true,
              width: 1,
            },
            axisLine: {
              show: false,
              lineStyle: {
                width: 10,
                color: "#D7D7E3", //线的颜色
              },
            },
            axisTick: {
              distance: -25,
              length: 10,
              splitNumber: 10, //线的密度
              lineStyle: {
                width: 2, //线的宽度
                color: "#D7D7E3", //线的颜色
              },
            },
            // 隔几个变长
            splitLine: {
              show: false,
            },
            axisLabel: {
              show: false,
            },
            anchor: {
              show: false,
            },
            title: {
              show: false,
            },
            detail: {
              show: false,
            },
            data: [],
          },
          {
            type: "pie",
            center:
              this.table.legendLocation == "left"
                ? ["67%", "50%"]
                : ["50%", "40%"],
            radius:
              this.table.legendLocation == "left"
                ? ["60%", "85%"]
                : ["45%", "65%"], //饼图的半径,第一项是内半径,第二项是外半径
            avoidLabelOverlap: false,
            itemStyle: {
              // borderRadius: 5,
              borderColor: "#fff",
              borderWidth: 3,
            },
            label: {
              position: "inner",
              formatter: "{c}",
            },

            // emphasis: {
            //   label: {
            //     show: true,
            //     fontSize: 40,
            //     fontWeight: "bold",
            //   },
            // },
            data: this.table.datas.map((item, index) => {
              let obj = {
                // label: { color: this.table.color[index] },
                name: item.NAME,
                value: item.VALUE || item.NUM,
              };
              return obj;
            }),
          },
        ],
      };
      let chartDom = this.$refs.doughnutChart2;
      let myChart = this.$E.init(chartDom);
      myChart.setOption(option);
    },
    //计算总和
    calculatePropertySum(arr, property) {
      return arr.reduce((sum, obj) => {
        const value = parseFloat(obj[property]);
        if (!isNaN(value)) {
          return sum + value;
        } else {
          return sum;
        }
      }, 0);
    },
  },
};
</script>

<style scoped lang="scss">
.wrapper {
  width: 100%;
  height: 100%;
  position: relative;
  #doughnutChart2 {
    width: 100%;
    height: 100%;
    box-sizing: border-box;
    position: absolute;
    top: 0;
    left: 0;
  }
}
</style>

组件调用:

<DoughnutChart2 :style="{ height: heightNew }" :table="table" />
// heightNew  动态计算的高度
// table:
/**
 * {
  "datas": [
    {
      "NAME": "主任护师",
      "VALUE": 10
    },
    {
      "NAME": "副主任护师",
      "VALUE": 64
    },
    {
      "NAME": "主管护师",
      "VALUE": 418
    },
    {
      "NAME": "护师",
      "VALUE": 397
    },
    {
      "NAME": "护士",
      "VALUE": 86
    }
  ],
  "color": [
    "#5470c6",
    "#91cc75",
    "#fac858",
    "#ee6666",
    "#73c0de",
    "#3ba272",
    "#fc8452",
    "#9a60b4",
    "#ea7ccc",
    "#8364FF",
    "#36F4D7",
    "#FBB03C"
  ],
  "legendLocation": [
    "left"
  ],
  "showTotalNum": true,
  "legendIcon": [
    "round"
  ]
}
 */

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数学建模-二氧化碳排放及时空分布测度

二氧化碳排放及时空分布测度 整体求解过程概述(摘要) 面临全球气候变化的巨大挑战&#xff0c;我国积极响应《巴黎协定》的号召&#xff0c;提出“2030年前碳达峰&#xff0c;2060 年前实现碳中和”的碳排放发展目标&#xff0c;并将碳中和相关工作作为 2021 年的重点任务之一…

node14升级node16之后无法启动处理

node从14升级到16之后&#xff0c;项目就无法启动了&#xff0c;研究了webpack3升级5&#xff0c;研究好几个小时都无法启动&#xff0c;最后发现&#xff0c;微微升级几个版本就可以了。webpack还是3 新版的依赖 "scripts": {"dev": "webpack-dev-se…

梳理一下嵌入式和单片机之间的关系

一定有很多人都听说过嵌入式和单片机&#xff0c;但在刚开始接触时&#xff0c;不知道大家有没有听说过嵌入式就是单片机这样的说法&#xff0c;其实嵌入式和单片机还是有区别的。单片机与嵌入式到底有什么关系&#xff1f; 下面我们就来说说嵌入式和单片机之间的联系和区别吧…

spring IOC介绍

spring的Ioc真是个好东西啊&#xff0c;那它到底是什么东西呢&#xff0c;控制反转&#xff0c;到底是怎么转的呢&#xff1f; 假设啊你现在是一个导演&#xff0c;想排部戏&#xff0c;那是不是得需要演员和舞台(spring中的bean)&#xff0c;如果按平常的编程思维就是new 一个…

在linux上如何运用虚拟数据优化器VDO

本章主要介绍虚拟化数据优化器。 什么是虚拟数据优化器VDO 创建VDO设备以节约硬盘空间 16.1 了解什么是VDO VDO全称是Virtual Data Optimize&#xff08;虚拟数据优化)&#xff0c;主要是为了节省硬盘空间。 现在假设有两个文件file1和 file2&#xff0c;大小都是10G。file…

如何正确使用网管工业交换机

工业交换机是一种专为满足工业应用需求而设计的通讯设备。它具备工业级品质&#xff0c;如耐受高温和低温的能力&#xff0c;能够抵御振动、防雷和防尘。此外&#xff0c;工业交换机还集成了多种丰富的协议&#xff0c;包括路由、交换和安全功能。根据是否可进行“网络管理”的…

下跌中寻求上涨,昂首资本根据交易量预判牛市

各位投资者你是不是也害怕熊市&#xff0c;担心在熊市中被套&#xff0c;但是投资者你知道吗&#xff1f;专业的投资者难道在熊市中就不会交易吗&#xff1f;昂首资本肯定的告诉你&#xff0c;肯定是交易的&#xff0c;并且常常还是以盈利结束交易。其实我们投资者和专业高手的…

跨境企业必看,数据跨境传输相关要求详解

对于跨境企业而言&#xff0c;数据的跨境传输既是业务拓展、竞争力提升、运营效率优化的重要手段&#xff0c;也是全球化发展和国际合作的必要条件。然而&#xff0c;这一过程伴随着法律差异、技术难题等多重挑战&#xff0c;企业需要谨慎应对&#xff0c;确保数据的安全、合规…

深入理解Dubbo-2.Dubbo功能之高级特性分析

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理、分布式技术原理&#x1f525;如果感觉博主的文章还不错的话&#xff…

用虚拟信用卡绑定直接支付 (Google play账号绑定教程)

虚拟信用卡的用途十分广泛&#xff0c;可用于购买应用&#xff0c;游戏内购、谷歌商店以及自己账号的充值&#xff0c;对于喜欢外服游戏的小伙伴来说&#xff0c;学会使用谷歌商店绑定虚拟信用卡是十分重要的。谷歌账号如何绑定信用卡呢&#xff1f;谷歌商店如何充值&#xff1…

各大厂商证书申请遇到的问题

证书作用&#xff1a; 确保数据传输过程中不被篡改、拦截 遭受中间件攻击、确保数据完整性、保密性 申请方式&#xff1a; 文件验证、cname验证&#xff08;需要在域名平台上添加cname记录&#xff09; 本次采用文本验证 添加需要申请的域名 将tx生成的txt文件放在 IIS站点…

空中“千里眼” 复亚环保监测无人机助力生态保护

生态环境保护是全球共同关注的重要议题&#xff0c;为了持续改善环境、加强执法效能&#xff0c;复亚智能环保监测无人机在环保领域大显身手。该智能系统为环境执法人员提供了全新的工具&#xff0c;使其能够在无人机的“千里眼”下&#xff0c;及时发现和制止环境违法行为&…

表单小程序作用体现在哪

表单的用途非常广泛&#xff0c;它是线上收集信息或用户预约/需求服务的重要方式&#xff0c;对商家来说如今线上平台非常多&#xff0c;生意开展的形式也越来越多&#xff0c;比如常见的预约、报名、收款、产品支付等都可以通过表单实现。 接下来啊让我们看看通过【雨科】平台…

一文详解大模型归因机制,幻觉问题有救了!

作者 | 谢年年、python 大模型的幻觉问题一直是一个亟待解决的挑战。由于大模型的训练语料来源广泛&#xff0c;且都是未经筛选的现实世界文本&#xff0c;预训练的目标也仅在于预测下一个单词&#xff0c;并未对生成内容的真实性进行建模和验证&#xff0c;这导致了大模型幻觉…

基于SuperMap iObjects Java生成地图瓦片

作者&#xff1a;dongyx 前言 在GIS领域&#xff0c;地图瓦片技术作为GIS领域的关键技术&#xff0c;是提高地图服务性能的关键手段之一。通过预先生成地图的瓦片数据&#xff0c;可以显著提升用户访问地图时的响应速度和体验。SuperMap iObjects for Java作为一款强大的GIS开…

浏览器渲染页面的过程以及原理

什么是浏览器渲染 简单来说&#xff0c;就是将HTML字符串 —> 像素信息 渲染时间点 浏览器什么时候开始渲染&#xff1f; 网络线程发送请求&#xff0c;取回HTML封装为渲染任务并将其传递给渲染主线程的消息队列。 问题&#xff1a;只取回HTML吗&#xff1f;那CSS和JS呢&am…

帆软认证FCRP第二题

【题目要求】 数据库中有一张地区数据统计表&#xff0c;但是并不规则 &#xff0c;记录类似于&#xff0c;225100:02:3:20160725是一串代码&#xff0c;以&#xff1a;分割&#xff0c;第1位为地区代码&#xff0c;第2位为分类代码&#xff0c;第3位为数量&#xff0c;第4位为…

Leetcode—901.股票价格跨度【中等】

2023每日刷题&#xff08;五十二&#xff09; Leetcode—901.股票价格跨度 算法思想 实现代码 class StockSpanner { public:stack<pair<int, int>> st;int curday -1;StockSpanner() {st.emplace(-1, INT_MAX);}int next(int price) {while(price > st.top(…

[网鼎杯 2020 朱雀组]phpweb1

提示 call_user_func()函数先通过php内置函数来进行代码审计绕过system&#xff08;##不止一种方法&#xff09; 拿到题目养成一个好的习惯先抓个包 从抓到的包以及它首页的报错来看&#xff0c;这里死活会post传输两个参数func以及p func传输函数&#xff0c;而p则是传输参数的…

关于前端原生技术-Jsonp的理解与简述

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/134777717 出自【进步*于辰的博客】 在学习了Jsoup这个知识点之后&#xff0c;发觉js的这一特点…