vue---echarts环形图

news2024/11/28 0:57:47

1、完整代码直接可以cv 

<template>
  <div id="main1"></div>
</template>

<script>
import * as echarts from 'echarts';
// import { mapState } from 'vuex';
// import { Alarm_Device } from '../utils/api.js';
export default {
  name: 'PieChart',

  data() {
    return {
      chart: null,
      data: [
        { value: 1048, name: '人体探测器', itemStyle: { color: '#4f7ff7' } },
        { value: 262, name: '生命体征探测器', itemStyle: { color: '#be71f2' } },
        { value: 210, name: '防摔倒探测器', itemStyle: { color: '#7586f5' } },
        { value: 140, name: '智能床垫', itemStyle: { color: '#6ee497' } },
        { value: 90, name: '智能手表', itemStyle: { color: '#4ebfff' } }
      ]
    };
  },
  computed: {
    // ...mapState(['login']),
  },
  mounted() {
    this.initChart();
    this.registerUser()
  },

  beforeDestroy() {
    if (this.chart) {
      this.chart.dispose();
    }
  },

  methods: {


    getItemStyleByName(name) {
      // 根据设备名称返回对应的颜色
      const colorMap = {
        '人体探测器': '#4f7ff7',
        '生命体征探测器': '#be71f2',
        '防摔倒探测器': '#7586f5',
        '智能床垫': '#6ee497',
        '智能手表': '#4ebfff'
      };
      return { color: colorMap[name] || '#ffffff' }; // 如果名称未找到,则默认为白色
    },

    initChart() {
      const chartDom = document.getElementById('main1');
      this.chart = echarts.init(chartDom);

      const options = this.getChartOptions();
      this.chart.setOption(options);
    },

    getChartOptions() {
      const total = this.data.reduce((sum, item) => sum + item.value, 0);
      const dataWithPercentage = this.data.map(item => ({
        value: item.value,
        name: item.name,
        percentage: `${(item.value / total * 100).toFixed(1)}%`,
        itemStyle: item.itemStyle
      }));
      return {
        title: {
          text: '总数量',
          subtext: '100%',
          left: 'center',
          top: '40%',
          left: '29%',
          textAlign: 'center',
          textStyle: {
            fontSize: 18,
            fontWeight: 'bold',
            color: '#ffffff'
          },
          subtextStyle: {
            fontSize: 17,
            color: '#ffffff'
          }
        },
        legend: {
          orient: 'vertical',
          right: '16%',
          top: 'center',
          textStyle: {
            color: '#fff',  // 图例文字颜色
            fontSize: 12,   // 图例文字大小
          },
          formatter: (name) => {
            const item = dataWithPercentage.find(d => d.name === name);
            return item ? `${item.name} ${item.percentage}` : name;
          },
        },
        tooltip: {
          trigger: 'item',
        },
        label: {
          show: true,
          color: '#fff',  // 设置文字颜色为白色
          position: 'outside',
          formatter: ({ data }) => `${data.percentage}` // 只显示百分比
        },
        emphasis: {
          label: {
            show: true,
            fontSize: 20,
            fontWeight: 'bold',
            color: '#fff'  // 确保在强调状态下文字依然为白色
          },
        },
        labelLine: {
          show: true,
          lineStyle: {
            color: '#fff'  // 设置指引线的颜色为白色
          }
        },
        series: [
          {
            name: '',
            type: 'pie',
            radius: ['40%', '70%'],
            center: ['30%', '50%'], // 将中心位置设置为垂直和水平的中点
            data: dataWithPercentage,
            // 移除startAngle和endAngle,以显示完整的圆形
          },
        ],
      };
    },
  },
};
</script>

<style scoped>
#main1 {
  width: 560px;
  height: 180px;
}
</style>

 2、初始化

initChart() {
  // 获取 DOM 元素,通过其 ID 获取到的元素将作为 ECharts 实例的容器
  const chartDom = document.getElementById('main1');
  
  // 初始化 ECharts 实例,传入上面获取的 DOM 元素
  this.chart = echarts.init(chartDom);

  // 获取图表的配置项,这些配置项用于定义图表的类型、数据、样式等
  const options = this.getChartOptions();
  
  // 设置图表的配置项
  // 这一步将配置项应用到 ECharts 实例中,渲染出图表
  this.chart.setOption(options);
}

 所有的基本上都是先获取容器盒子,然后初始化echarts,最后配置options

 3、配置解释

getChartOptions() {
  // 计算数据总量,用于计算百分比
  const total = this.data.reduce((sum, item) => sum + item.value, 0);

  // 为每个数据项计算百分比,并保留原有的 itemStyle
  const dataWithPercentage = this.data.map(item => ({
    value: item.value,
    name: item.name,
    percentage: `${(item.value / total * 100).toFixed(1)}%`, // 计算并格式化百分比
    itemStyle: item.itemStyle // 保留原有的样式
  }));

  return {
    // 图表标题配置
    title: {
      text: '总数量', // 主标题文本
      subtext: '100%', // 副标题文本
      left: 'center', // 主标题水平居中
      top: '40%', // 主标题垂直位置
      left: '29%', // 主标题水平位置
      textAlign: 'center', // 主标题文本对齐方式
      textStyle: {
        fontSize: 18, // 主标题字体大小
        fontWeight: 'bold', // 主标题字体粗细
        color: '#ffffff' // 主标题字体颜色
      },
      subtextStyle: {
        fontSize: 17, // 副标题字体大小
        color: '#ffffff' // 副标题字体颜色
      }
    },
    // 图例配置
    legend: {
      orient: 'vertical', // 图例垂直排列
      right: '16%', // 图例水平位置
      top: 'center', // 图例垂直居中
      textStyle: {
        color: '#fff',  // 图例文字颜色
        fontSize: 12,   // 图例文字大小
      },
      // 格式化图例文字,显示名称和百分比
      formatter: (name) => {
        const item = dataWithPercentage.find(d => d.name === name);
        return item ? `${item.name} ${item.percentage}` : name;
      },
    },
    // 提示框配置
    tooltip: {
      trigger: 'item', // 鼠标悬停在项上触发提示框
    },
    // 标签配置
    label: {
      show: true, // 显示标签
      color: '#fff',  // 标签文字颜色
      position: 'outside', // 标签位置在图形外部
      formatter: ({ data }) => `${data.percentage}` // 标签只显示百分比
    },
    // 高亮显示配置
    emphasis: {
      label: {
        show: true, // 高亮时显示标签
        fontSize: 20, // 高亮时标签字体大小
        fontWeight: 'bold', // 高亮时标签字体粗细
        color: '#fff'  // 高亮时标签字体颜色
      },
    },
    // 标签线配置
    labelLine: {
      show: true, // 显示标签线
      lineStyle: {
        color: '#fff'  // 标签线颜色
      }
    },
    // 系列数据配置
    series: [
      {
        name: '', // 系列名称
        type: 'pie', // 图表类型为饼图
        radius: ['40%', '70%'], // 饼图的半径范围,内环到外环
        center: ['30%', '50%'], // 饼图中心位置,水平和垂直的百分比位置
        data: dataWithPercentage, // 使用带有百分比的数据
        // 移除 startAngle 和 endAngle 使饼图显示完整的圆形
      },
    ],
  };
}

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

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

相关文章

视频美颜SDK与直播美颜工具的架构设计与性能优化

本篇文章&#xff0c;小编将深入讲解视频美颜SDK与直播美颜工具的架构设计&#xff0c;并分享一些性能优化的实践经验。 一、视频美颜SDK的架构设计 视频美颜SDK的核心在于其模块化的设计思路。通常&#xff0c;视频美颜SDK由以下几个主要模块组成&#xff1a; 1.图像预处理…

【Qt】常用控件QCalendarWidget的使用

常用控件QCalendarWidget的使用 QCalendarWidget表示一个日历 核心属性 属性说明 selectDate 当前选中的⽇期 minimumDate 最⼩⽇期 maximumDate 最⼤⽇期 firstDayOfWeek 每周的第⼀天(也就是⽇历的第⼀列) 是周⼏. gridVisible 是否显⽰表格的边框 selectionMode…

AWS不同类型的EC2实例分别适合哪些场景?

Amazon Web Services&#xff08;AWS&#xff09;的弹性计算云&#xff08;EC2&#xff09;提供了多种实例类型&#xff0c;以满足不同的应用需求和工作负载。了解不同类型的 EC2 实例及其适用场景&#xff0c;可以帮助用户更好地优化性能和控制成本。九河云和大家一起了解一下…

Selenium + Python 自动化测试21(PO+HTML+Mail)

我们的目标是&#xff1a;按照这一套资料学习下来&#xff0c;大家可以独立完成自动化测试的任务。 上一篇我们讨论了PO模式并举例说明了基本的思路&#xff0c;今天我们继续学习。 本篇文章我们综合一下之前学习的内容&#xff0c;如先将PO模式和我们生成HTML报告融合起来&am…

gewe微信聊天机器人搭建教程

由于自身在机器人方面滚爬多年&#xff0c;现在收藏几个宝藏机器人 推荐一下自己常用的机器人&#xff1a; 适合有技术开发的公司&#xff0c;可以自主开发所需要的功能&#xff01;十分齐全 测试问文档&#xff1a;开发前必读 - GeWe开放平台 有需要的兄弟可以看一下&…

笔记 6 : 彭老师课本第 5 章 ,举例分析 IIC 编程,以及开启虚拟机

&#xff08;60&#xff09; 首先看 IIC 的陀螺仪的底板图&#xff0c;board 图&#xff1a; 以 GYRO_INT 为例去查找其对应的控制器&#xff1a; 继续查找 I2C_SCL5 以及 I2C_SDA5 : MPU6050 以及比较复杂&#xff0c;需要查看其手册&#xff0c;全英文版&#xff1a; 再…

iOS开发进阶(二十二):Xcode* 离线安装 iOS Simulator

文章目录 一、前言二、模拟器安装 一、前言 Xcode 15 安装包的大小相比之前更小&#xff0c;因为除了 macOS 的 Components&#xff0c;其他都需要动态下载安装&#xff0c;否则提示 iOS 17 Simulator Not Installed。 如果不安装对应的运行模拟库&#xff0c;真机和模拟器无法…

深入理解Java虚拟机(线程安全)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 线程安全 当多个线程同时访问一个对象时&#xff0c;如果不用考虑…

图片清晰修复有什么方法?归纳了三种

图片清晰修复有什么方法&#xff1f;图片清晰度的修复是一项常见的后期处理任务&#xff0c;尤其当原始照片由于各种原因如手抖、光线不足等出现模糊不清的情况时。下文将介绍三种不同的软件修复方法来帮助提高图片的清晰度和细节&#xff0c;让你的照片看起来更加生动和专业。…

Kubectl命令、初识pod、namespace

文章目录 一、Kubectl简介基础命令1.基本信息命令2.创建和更新资源命令3.删除资源命令4. 查看日志和调试命令5. 端口转发和复制文件命令6. 部署管理命令7. 伸缩命令8. 配置和上下文管理命令9.常用命令 二、Pod简介核心概念pod常见状态调度和初始化阶段容器创建和运行阶段异常状…

【案例52】oracle进程占用CPU100%分析实战

问题现象 Linux环境&#xff0c;数据库CPU一直处于100%。业务系统运行很慢。Top命令结果如下&#xff1a; 问题分析 方法1 根据上图中的oracle进程在操作系统对应的 PID号 : 如 6999,8100 等 通过下面的SQL,查询 select s.SQL_HASH_VALUE, s.SQL_ADDRESSfrom v$session …

PCB线宽和线间距设计PCB抄板

尽量加宽电源、地线宽度&#xff0c;最好是地线比电源线宽&#xff0c;它们的关系是&#xff1a;地线>电源线>信号线&#xff0c;通常信号线宽&#xff1a;0.2~0.3mm&#xff0c;最细宽度可达到0.05~0.07mm&#xff0c;电源线宽为1.2~2.5mm 一般宽度不宜小于0.2mm(8mi…

鹭鹰优化算法SBOA优化RBF神经网络的扩散速度实现多数入多输出数据预测,可以更改数据集(MATLAB代码)

一、鹭鹰优化算法介绍 鹭鹰优化算法&#xff08;Secretary Bird Optimization Algorithm, SBOA&#xff09;是一种新型的元启发式算法&#xff0c;它于2024年4月由Youfa Fu等人提出&#xff0c;并发表在SCI人工智能二区顶刊《Artificial Intelligence Review》上。该算法的灵感…

【机器学习】神经网络简介以及如何用Tensorflow构建一个简单的神经网络

引言 神经网络是一种模拟人脑神经元连接和工作方式的计算模型&#xff0c;它是深度学习的基础&#xff0c;并在机器学习领域中扮演着重要角色 文章目录 引言一、神经网络简介1.1 结构组成1.2 工作原理1.3 学习过程1.4 应用领域1.5 感知器1.6 功能特点1.7 总结 二、用Tensorflow…

根据 Web 服务器端的架构相关知识,将PHP改JAVA重构企业网站系统

目录 案例 【题目】 【问题 1】(7 分) 【问题 2】(8 分) 【问题 3】(10 分) 答案 【问题 1】解析 【问题 2】解析 【问题 3】解析 相关推荐 案例 阅读以下关于应用服务器的叙述&#xff0c;在答题纸上回答问题 1 至问题 3。 【题目】 某电子产品制造公司&#xff0c…

现有electron-quick-start把vue项目打包后的dist打包exe自定义最小化点击事件

1.preload.js里暴露接口 const { contextBridge, ipcRenderer } require(electron) contextBridge.exposeInMainWorld(electronAPI, {WindowMin: (data) > {ipcRenderer.send(window-min, data);} });2.vue文件处理 if(window.electronAPI){window.electronAPI.WindowMi…

12/24/30v/36转固定5v输出芯片

设计电源芯片的应用方案时&#xff0c;必须保证输入电压在DC6V至30V范围内&#xff0c;输出电压为固定的5V&#xff0c;同时电流需在200至300mA之间。在这种需求下&#xff0c;推荐使用AH1405芯片&#xff0c;因其输入电压范围宽&#xff08;6-40V&#xff09;&#xff0c;内置…

正则表达式——详解

正则表达式是什么&#xff1f; 正则表达式&#xff08;Regular Expression&#xff0c;通常简写为 regex、regexp 或 RE&#xff09;是一种强大的文本处理工具&#xff0c;用于描述一组字符串的模式。它可以用来匹配、查找、替换等操作&#xff0c;几乎所有现代编程语言都支持…

【精选】基于Python的热门旅游景点数据分析系统的设计与实现(南京旅游,北京旅游,旅游网站,全国各地旅游网站)

目录&#xff1a; 系统简介&#xff1a; 关键技术介绍 2.1 PYTHON语言简介 2.2 MySql数据库 2.3 DJANGO框架 2.4 Hadoop介绍 2.5 Scrapy介绍 2.6 B/S架构 系统总功能结构设计 系统详细实现&#xff1a; 6系统测试 系统测试的目的 软件测试过程 测试用例 为什么选择…

学习之nodejs安装

安装地址 https://nodejs.org/en/download/package-manager 安装 配置环境变量