echarts绘制一个环形图

news2024/11/20 11:42:11

其他echarts: 

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

 echarts绘制一个饼图

echarts绘制一个环形图2 

效果图:

代码:

<template>
  <div class="wrapper">
    <!-- 环形图 -->
    <div ref="doughnutChart" id="doughnutChart"></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: 100, //总数
      showLegend: false, //是否显示label标签
    };
  },

  created() {},
  mounted() {},
  watch: {
    table: {
      handler(newVal) {
        if (newVal) {
          // 进行数据处理操作
          if (newVal.limitLength) this.limitLength = newVal.limitLength;
          this.showLegend = newVal.showLegend;
          //计算总数
          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" ? "70%" : "48.5%",
              this.table.legendLocation == "left" ? "50%" : "50%"
            ).adjustedLeft,
            top: this.$common.adjustOffset(
              this.totalNum,
              this.table.legendLocation == "left" ? "70%" : "48.5%",
              this.table.legendLocation == "left" ? "50%" : "50%"
            ).adjustedTop,
            textStyle: {
              color: "#333333",
              fontSize: "22",
              fontWeight: "600",
              textAlign: "center", // 设置标题居中对齐
            },
          },
          {
            show: this.showTotalNum,
            text: "总计",
            left: this.$common.adjustOffset(
              "总计",
              this.table.legendLocation == "left" ? "70.5%" : "48.5%",
              this.table.legendLocation == "left" ? "37.5%" : "37.5%"
            ).adjustedLeft,
            top: this.$common.adjustOffset(
              "总计",
              this.table.legendLocation == "left" ? "70.5%" : "46.5%",
              this.table.legendLocation == "left" ? "37.5%" : "37.5%"
            ).adjustedTop,
            textStyle: {
              color: "#333333",
              fontSize: "12",
              fontWeight: "500",
              textAlign: "center", // 设置标题居中对齐
            },
          },
        ],
        //颜色注释显示的位置
        legend: {
          orient:
            this.table.legendLocation == "left" ? "vertical" : "horizontal",
          // right: 10,
          // top: "center",
          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[0].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",
            center:
              this.table.legendLocation == "left"
                ? ["72%", "50%"]
                : ["50%", "46%"],
            radius:
              this.table.legendLocation == "left"
                ? ["50%", "70%"]
                : ["42%", "62%"], //饼图的半径,第一项是内半径,第二项是外半径
            avoidLabelOverlap: false,
            itemStyle: {
              color: (params) => {
                let index = params.dataIndex;
                return this.table.color[index];
              },
            },
            label: {
              show: this.showLegend,
              position: "outer",
              formatter: "{c}",
            },
            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.doughnutChart;
      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;
  #doughnutChart {
    width: 100%;
    height: 100%;
    box-sizing: border-box;
    position: absolute;
    top: 0;
    left: 0;
  }
}
</style>

调用:

<DoughnutChart
  :table="table"
  :style="{ height: heightNew }"
/>
// table
/**
 * {
  "datas": [
    {
      "NAME": "南京医科大学康达学院",
      "VALUE": 20
    },
    {
      "NAME": "江苏护理职业学院",
      "VALUE": 25
    },
    {
      "NAME": "无锡太湖学院",
      "VALUE": 16
    },
    {
      "NAME": "江苏医药职业学院",
      "VALUE": 47
    },
    {
      "NAME": "安徽省淮北卫生学校",
      "VALUE": 5
    },
    {
      "NAME": "江苏卫生健康职业学院",
      "VALUE": 10
    },
    {
      "NAME": "太湖创意职业技术学院",
      "VALUE": 2
    }
  ],
  "color": [
    "#5470c6",
    "#91cc75",
    "#fac858",
    "#ee6666",
    "#73c0de",
    "#3ba272",
    "#fc8452",
    "#9a60b4",
    "#ea7ccc",
    "#8364FF",
    "#36F4D7",
    "#FBB03C"
  ],
  "showPercentage": true,
  "showLegend": true,
  "showTotalNum": true,
  "limitLength": 10
}
 */

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

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

相关文章

[面试题~k8s] 云原生必问基础篇

文章目录 概念篇1. k8s 是什么2. Container3. Pod4. Node5. Namespace6. Service7. Label8. Replica Set&#xff08;副本集)9. Deployment10. Volume11. Namespace12. PV 和 PVC 基础篇1. 删除 pod 流程2. k8s 有哪些组件master nodeworker node 3. k8s 和 docker 的关系4. 简…

mysql原理--InnoDB数据页结构

1.不同类型的页 页是 InnoDB 管理存储空间的基本单位&#xff0c;一个页的大小一般是 16KB 。InnoDB 为了不同的目的而设计了许多种不同类型的页。下面讨论存放我们表中记录的那种类型的页&#xff0c;官方称这种存放记录的页为索引&#xff08; INDEX &#xff09;页&#xff…

【开源】基于Vue+SpringBoot的河南软件客服系统

文末获取源码&#xff0c;项目编号&#xff1a; S 067 。 \color{red}{文末获取源码&#xff0c;项目编号&#xff1a;S067。} 文末获取源码&#xff0c;项目编号&#xff1a;S067。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统管理人员2.2 业务操作人员 三、…

【STM32】TIM定时器编码器

1 编码器接口简介 Encoder Interface 编码器接口 编码器接口可接收增量&#xff08;正交&#xff09;编码器的信号&#xff0c;根据编码器旋转产生的正交信号脉冲&#xff0c;自动控制CNT自增或自减&#xff0c;从而指示编码器的位置、旋转方向和旋转速度 接收正交信号&#…

视频剪辑技巧:批量合并视频,几个步骤轻松完成

在视频剪辑过程中&#xff0c;批量合并视频是一个常见的需求。通过合并多个视频文件&#xff0c;可以减少剪辑时间和提高工作效率。在开始合并视频之前&#xff0c;首先要明确需求和目的。例如&#xff0c;是想要将多个短视频片段随机合并成一个新的视频&#xff0c;还是想要将…

5分钟了解自动化测试,自动化优势、劣势、工具和框架选择全剖析

本文共有3963字&#xff0c;快速阅读需要大约5分钟&#xff0c;赏味期限持久。 随着软件测试技术的发展&#xff0c;人们已经从最初的纯粹的手工测试转变为手工与自动化测试技术相结合的测试方法。近年来&#xff0c;自动化测试越来越受到人们的重视&#xff0c;对于自动化测试…

mysql面试题——MVCC

一&#xff1a;什么是MVCC&#xff1f; 多版本并发控制&#xff0c;更好的方式去处理读-写冲突&#xff0c;就是为了查询一些正在被另一个事务更新的行&#xff0c;并且可以看到它们被更新之前的值&#xff0c;这样在做查询的时候就不用等待另一个事务释放锁。 二&#xff1a…

【投稿优惠|检索稳定】2024年信息系统、工程与数字化经济国际会议(ICISEDE 2024)

2024年信息系统、工程与数字化经济国际会议(ICISEDE 2024) 2024 International Conference on Information Systems and Engineering and the Digital Economy(ICISEDE 2024) [会议简介] 2024 年信息系统、工程与数字化经济国际会议(ICISEDE 2024)将于 2024 年 1 月 20 日在厦门…

研习代码 day52 | 单调栈问题——柱状图中最大的矩形

一、柱状图中最大的矩形 1.1 题目 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例 1: 输入&#xff1a;heights [2,1,5,6,2,3] 输出&#xff1a;…

TruLens RAG Triad 学习

TruLens RAG Triad 学习 0. 背景1. RAG 三元组2. TruLens 快速入门2-1. 安装依赖2-2. 初始化 OpenAI 认证信息2-3. 获取数据2-4. 创建向量存储2-5. 从头构建自定义 RAG2-6. 设置反馈函数2-7. 构建应用程序2-8. 运行应用程序0. 背景 近年来,RAG 架构已成为为大型语言模型 (LLM…

第21章总结 网络通信

21.1网络程序设计基础 21.1.1 局域网与互联网 为了实现两台计算机的通信&#xff0c;必须用一个网络线路连接两台计算机。如下图所示 21.1.2 网络协议 1.IP协议 IP是Internet Protocol的简称&#xff0c;是一种网络协议。Internet 网络采用的协议是TCP/IP协议&#x…

如何利用人工智能+物联网技术实现自动化设备生产

随着科技的发展与行业竞争的日益激烈&#xff0c;制造业也逐渐走向智能化发展。制造业的改革是利用物联网技术和自动化设备&#xff0c;实现生产线的智能化和自适应生产&#xff0c;优化生产流程&#xff0c;提高生产效率和质量&#xff0c;为企业创造更大的价值。 方案概述 智…

计算目标检测和语义分割的PR

需求描述 实际工作中&#xff0c;相比于mAP项目更加关心的是特定阈值下的precision和recall结果&#xff1b;由于本次的GT中除了目标框之外还存在多边形标注&#xff0c;为此&#xff0c;计算IoU的方式从框与框之间变成了mask之间&#xff1b; 本文的代码适用于MMDetection下的…

wireshark过滤包小技巧

1、过滤包含某个字符串的数据包&#xff1a; 或者&#xff1a; 2、过滤包含某一连续十六进制的数据包&#xff1a; 或者&#xff1a; 3、过滤精确到位数位置 或者&#xff1a;

1-Tornado的介绍

1 tornado的介绍 **Tornado**是一个用Python编写的可扩展的、无阻塞的**Web应用程序框架**和**Web服务器**。 它是由FriendFeed开发使用的&#xff1b;该公司于2009年被Facebook收购&#xff0c;而Tornado很快就开源了龙卷风以其高性能着称。它的设计允许处理大量并发连接&…

实时动作识别学习笔记

目录 yowo v2 yowof 判断是在干什么,不能获取细节信息 yowo v2 https://github.com/yjh0410/YOWOv2/blob/master/README_CN.md ModelClipmAPFPSweightYOWOv2-Nano1612.640ckptYOWOv2-Tiny

2024年度AI投资策略报告:乘AI之风,破明日之浪

今天分享的AI系列深度研究报告&#xff1a;《2024年度AI投资策略报告&#xff1a;乘AI之风&#xff0c;破明日之浪》。 &#xff08;报告出品方&#xff1a;万联证券&#xff09; 报告共计&#xff1a;25页 1 需求复苏&#xff0c;政策指引热点驱动AI 赋能助推行业发展 1.1 …

【车载开发系列】Visio工具使用小技巧

【车载开发系列】Visio工具使用小技巧 【车载开发系列】Visio工具使用小技巧 【车载开发系列】Visio工具使用小技巧一. Word中编辑Visio技巧二. Word中插入visio图形的问题三. 总结 一. Word中编辑Visio技巧 本节主要介绍了Microsoft Word中编辑Visio图形的具体方法。 在 Word…

PyQt6 QTimeEdit时间控件

​锋哥原创的PyQt6视频教程&#xff1a; 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计39条视频&#xff0c;包括&#xff1a;2024版 PyQt6 Python桌面开发 视频教程(无废话…

Echarts图表title使用富文本

rich中有配置的话&#xff08;如a&#xff09;使用该样式&#xff0c;没有配置样式的话&#xff08;如b&#xff09;使用外层textstyle的样式&#xff0c;textstyle没有样式的话使用默认样式 const option1 {tooltip: {trigger: "item",},title: {text: ["{a|1…