极致呈现系列之:Echarts饼图的千变万化

news2024/11/25 19:51:27

目录

  • 创建一个最简单的饼图
  • 美化饼图
    • 修改颜色
    • 修改饼图的边框线条样式
    • 修改饼图的标签样式
    • 添加饼图的阴影效果
    • 添加修改饼图的图例样式
  • 添加交互
  • 饼图的变化
    • 环形图
    • 动画装饰仪表盘

创建一个最简单的饼图

这个没什么好说的,懂的都懂,直接上代码

//安装 Echarts
npm install echarts --save

在 Vue 组件中引入 Echarts 并创建一个简单的饼图,代码如下:

<template>
  <div ref="chart" style="width: 50%;height: 400px;"></div>
</template>
<script setup>
import * as echarts from 'echarts'
import { ref, onMounted } from 'vue'
const chart = ref(null)
onMounted(() => {
  const myChart = echarts.init(chart.value)
  const option = {
    series: [
      {
        type: 'pie',
        data: [
          { value: 335, name: '直接访问' },
          { value: 310, name: '邮件营销' },
          { value: 234, name: '联盟广告' },
          { value: 135, name: '视频广告' },
          { value: 1548, name: '搜索引擎' }
        ]
      }
    ]
  }
  myChart.setOption(option)
})

运行代码,效果如下
在这里插入图片描述

美化饼图

修改颜色

通过设置color属性来修改饼图的颜色

const option = {
    color: ['#deb140', '#49dff0', '#034079', '#6f81da', '#00ffb4'],
    series: [
      {
        type: 'pie',
        data: [
          { value: 335, name: '直接访问' },
          { value: 310, name: '邮件营销' },
          { value: 234, name: '联盟广告' },
          { value: 135, name: '视频广告' },
          { value: 1548, name: '搜索引擎' }
        ], 
      }
    ]
  }

在这里插入图片描述

修改饼图的边框线条样式

通过设置 itemStyle 属性中的 borderWidthborderColor 来修改饼图的边框线条样式。

const option = {
    color: ['#deb140', '#49dff0', '#034079', '#6f81da', '#00ffb4'],
    series: [
      {
        type: 'pie',
        data: [
          { value: 335, name: '直接访问' },
          { value: 310, name: '邮件营销' },
          { value: 234, name: '联盟广告' },
          { value: 135, name: '视频广告' },
          { value: 1548, name: '搜索引擎' }
        ],
        itemStyle: {
          borderWidth: 2,
          borderColor: '#fff'
        }
      }
    ]
  }

在这里插入图片描述

修改饼图的标签样式

通过设置 label 属性中的 colorfontSizefontWeight 等属性来修改饼图的标签样式。

 series: [
      {
        type: 'pie',
        data: [
          { value: 335, name: '直接访问' },
          { value: 310, name: '邮件营销' },
          { value: 234, name: '联盟广告' },
          { value: 135, name: '视频广告' },
          { value: 1548, name: '搜索引擎' }
        ], 
        itemStyle: {
          borderWidth: 2,
          borderColor: '#fff'
        },
        label: {
          color: '#333',
          fontSize: 14,
          fontWeight: 'bold'
        },
      }
    ]

在这里插入图片描述

添加饼图的阴影效果

通过设置 itemStyle 属性中的 shadowBlurshadowColorshadowOffsetX 等属性来添加饼图的阴影效果。

series: [
      {
        type: 'pie',
        data: [
         //数据
        ],
        label: {
          // label配置项
        },
        itemStyle: {
          borderWidth: 1,
          borderColor: '#fff', 
          shadowBlur: 10,
          shadowColor: 'rgba(0, 0, 0, 0.5)',
          shadowOffsetX: 0,
          shadowOffsetY: 0
        }
      }
    ]

在这里插入图片描述

添加修改饼图的图例样式

通过设置 legend 属性中的 textStyle 属性来修改饼图的图例样式。

color: ['#deb140', '#49dff0', '#034079', '#6f81da', '#00ffb4'],
legend: {
   textStyle: {
      color: '#333',
      fontSize: 14
   }
},
series: [
  //series代码块
]

在这里插入图片描述

添加交互

通过添加emphasis属性实现鼠标悬停高亮效果

series: [
      {
        type: 'pie',
        data: [
          { value: 335, name: '直接访问' },
          { value: 310, name: '邮件营销' },
          { value: 234, name: '联盟广告' },
          { value: 135, name: '视频广告' },
          { value: 1548, name: '搜索引擎' }
        ],
        emphasis: {
          itemStyle: {
            shadowBlur: 10,
            shadowOffsetX: 0,
            shadowColor: 'rgba(0, 0, 0, 0.5)'
          }
        },
        label: {
          color: '#333',
          fontSize: 14,
          fontWeight: 'bold'
        },
        itemStyle: {
          borderWidth: 1,
          borderColor: '#fff',
          shadowBlur: 10,
          shadowColor: 'rgba(0, 0, 0, 0.5)',
          shadowOffsetX: 0,
          shadowOffsetY: 0
        }
      }
    ]

在这里插入图片描述

饼图的变化

环形图

环形图是一种基于饼图的图表类型,它可以将饼图的中间部分空出来,形成环形的效果。要创建环形图非常简单,只需要在series中添加radius配置项就可以了,代码如下

series: [
      {
        type: 'pie',
        radius: ['50%', '70%'],
       //...其他配置项代码
] 

在这里插入图片描述

动画装饰仪表盘

动画装饰仪表盘是一种基于饼图的图表类型,它可以将饼图的中间部分空出来,形成仪表盘的效果,并且可以通过动画效果让指针实时移动。以下是动画装饰仪表盘的代码:

<template>
  <div ref="chart" style="width: 50%;height: 400px;"></div>
</template>
<script setup>
import * as echarts from 'echarts'
import { ref, onMounted } from 'vue'
const chart = ref(null) 
let angle = 0;//角度,用来做简单的动画效果的
let value = 55.33;
let myChart = ''
let option = {}
onMounted(() => {
  myChart = echarts.init(chart.value)
  option = {
    backgroundColor: "#061740",
    title: {
      text: '{a|' + value + '}{c|%}',
      x: 'center',
      y: 'center',
      textStyle: {
        rich: {
          a: {
            fontSize: 48,
            color: '#29EEF3'
          },
          c: {
            fontSize: 20,
            color: '#ffffff',
            // padding: [5,0]
          }
        }
      }
    }, 
    series: [{
      name: "ring5",
      type: 'custom',
      coordinateSystem: "none",
      renderItem: function (params, api) {
        return {
          type: 'arc',
          shape: {
            cx: api.getWidth() / 2,
            cy: api.getHeight() / 2,
            r: Math.min(api.getWidth(), api.getHeight()) / 2 * 0.6,
            startAngle: (0 + angle) * Math.PI / 180,
            endAngle: (90 + angle) * Math.PI / 180
          },
          style: {
            stroke: "#0CD3DB",
            fill: "transparent",
            lineWidth: 1.5
          },
          silent: true
        };
      },
      data: [0]
    }, {
      name: "ring5",
      type: 'custom',
      coordinateSystem: "none",
      renderItem: function (params, api) {
        return {
          type: 'arc',
          shape: {
            cx: api.getWidth() / 2,
            cy: api.getHeight() / 2,
            r: Math.min(api.getWidth(), api.getHeight()) / 2 * 0.6,
            startAngle: (180 + angle) * Math.PI / 180,
            endAngle: (270 + angle) * Math.PI / 180
          },
          style: {
            stroke: "#0CD3DB",
            fill: "transparent",
            lineWidth: 1.5
          },
          silent: true
        };
      },
      data: [0]
    }, {
      name: "ring5",
      type: 'custom',
      coordinateSystem: "none",
      renderItem: function (params, api) {
        return {
          type: 'arc',
          shape: {
            cx: api.getWidth() / 2,
            cy: api.getHeight() / 2,
            r: Math.min(api.getWidth(), api.getHeight()) / 2 * 0.65,
            startAngle: (270 + -angle) * Math.PI / 180,
            endAngle: (40 + -angle) * Math.PI / 180
          },
          style: {
            stroke: "#0CD3DB",
            fill: "transparent",
            lineWidth: 1.5
          },
          silent: true
        };
      },
      data: [0]
    }, {
      name: "ring5",
      type: 'custom',
      coordinateSystem: "none",
      renderItem: function (params, api) {
        return {
          type: 'arc',
          shape: {
            cx: api.getWidth() / 2,
            cy: api.getHeight() / 2,
            r: Math.min(api.getWidth(), api.getHeight()) / 2 * 0.65,
            startAngle: (90 + -angle) * Math.PI / 180,
            endAngle: (220 + -angle) * Math.PI / 180
          },
          style: {
            stroke: "#0CD3DB",
            fill: "transparent",
            lineWidth: 1.5
          },
          silent: true
        };
      },
      data: [0]
    }, {
      name: "ring5",
      type: 'custom',
      coordinateSystem: "none",
      renderItem: function (params, api) {
        let x0 = api.getWidth() / 2;
        let y0 = api.getHeight() / 2;
        let r = Math.min(api.getWidth(), api.getHeight()) / 2 * 0.65;
        let point = getCirlPoint(x0, y0, r, (90 + -angle))
        return {
          type: 'circle',
          shape: {
            cx: point.x,
            cy: point.y,
            r: 4
          },
          style: {
            stroke: "#0CD3DB",//粉
            fill: "#0CD3DB"
          },
          silent: true
        };
      },
      data: [0]
    }, {
      name: "ring5",  //绿点
      type: 'custom',
      coordinateSystem: "none",
      renderItem: function (params, api) {
        let x0 = api.getWidth() / 2;
        let y0 = api.getHeight() / 2;
        let r = Math.min(api.getWidth(), api.getHeight()) / 2 * 0.65;
        let point = getCirlPoint(x0, y0, r, (270 + -angle))
        return {
          type: 'circle',
          shape: {
            cx: point.x,
            cy: point.y,
            r: 4
          },
          style: {
            stroke: "#0CD3DB",      //绿
            fill: "#0CD3DB"
          },
          silent: true
        };
      },
      data: [0]
    }, {
      name: '吃猪肉频率',
      type: 'pie',
      radius: ['58%', '45%'],
      silent: true,
      clockwise: true,
      startAngle: 90,
      z: 0,
      zlevel: 0,
      label: { 
          position: "center", 
      },
      data: [{
        value: value,
        name: "",
        itemStyle: { 
            color: { // 完成的圆环的颜色
              colorStops: [{
                offset: 0,
                color: '#4FADFD' // 0% 处的颜色
              }, {
                offset: 1,
                color: '#28E8FA' // 100% 处的颜色
              }]
            }, 
        }
      },
      {
        value: 100 - value,
        name: "",
        label: { 
            show: false 
        },
        itemStyle: { 
            color: "#173164" 
        }
      }
      ]
    },
    {
      name: "",
      type: "gauge",
      radius: "58%",
      center: ['50%', '50%'],
      startAngle: 0,
      endAngle: 359.9,
      splitNumber: 8, 
      axisTick: {
        show: false
      },
      splitLine: {
        length: 60,
        lineStyle: {
          width: 5,
          color: "#061740"
        }
      },
      axisLabel: {
        show: false
      },
      pointer: {
        show: false
      },
      axisLine: {
        lineStyle: {
          opacity: 0
        }
      },
      detail: {
        show: false
      },
      data: [{
        value: 0,
        name: ""
      }]
    },
    ]
  }
  myChart.setOption(option)
})
//获取圆上面某点的坐标(x0,y0表示坐标,r半径,angle角度)
function getCirlPoint(x0, y0, r, angle) {
  let x1 = x0 + r * Math.cos(angle * Math.PI / 180)
  let y1 = y0 + r * Math.sin(angle * Math.PI / 180)
  return {
    x: x1,
    y: y1
  }
}
function draw() {
  angle = angle + 3
  myChart.setOption(option, true)
  //window.requestAnimationFrame(draw);
}
setInterval(function () {
  //用setInterval做动画感觉有问题
  draw()
}, 100);
</script>
<style scoped></style>

在这里插入图片描述

好了,由于篇幅的原因,饼图的相关内容就介绍到这里,其实关于饼图的变化还有很多,比如断开环形图、进度环形图等,有兴趣的小伙伴可以深入研究下

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

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

相关文章

LlamaIndex 简介:LLM 应用程序的数据框架

LlamaIndex 是一个非凡的工具&#xff0c;创建为一个全面的“数据框架”&#xff0c;以促进 LLM&#xff08;大型语言模型&#xff09;应用程序的开发。该框架与 ChatGPT 集成&#xff0c;充当大型语言模型和用户私人数据之间的桥梁。 借助 LlamaIndex&#xff0c;用户可以轻松…

Apache Zeppelin系列教程第九篇——Zeppelin NoteBook数据缓存

背景 在使用Zeppelin JDBC Intercepter 对于Hive 数据进行查询过程中&#xff0c;如果遇到非常复杂的sql&#xff0c;查询效率是非常慢 比如&#xff1a; select dt,count(*) from table group by dt做过数据开发的同学都知道&#xff0c;在hive sql查询过程中&#xff0c;hive…

MySQL - 第1节 - MySQL数据库基础

1.数据库的概念 数据库是按照数据结构来组织、存储和管理数据的仓库&#xff0c;是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。 虽然单纯的使用文件也可以存储数据&#xff0c;但会存在如下缺点&#xff1a; • 安全性问题&#xff1a;数据误操…

深搜-选数类问题

目录 1.问题引入 2.知识讲解 3.例题解析 【例题1】全排列。 【例题2】素数环Ⅱ。 【样例3】素数分解。 1.问题引入 上一节探讨了迷宫类问题&#xff0c;和平时遇到的迷宫小游戏类似&#xff0c;可以使用搜索程序求得迷宫的路径和最短路。本小节继续研究深搜的另一类问…

MySQL数据库的认识及基础命令操作

目录 一、数据库的基本概念 1、数据库定义 &#xff08;1&#xff09; 数据 &#xff08;2&#xff09;表 &#xff08;3&#xff09; 数据库 2、 数据库管理系统&#xff08;DBMS&#xff09; 3、 数据库系统&#xff08;DBS&#xff09; 二、数据库系统发展史 1、 第一…

【RabbitMQ教程】第五章 —— RabbitMQ - 死信队列

&#x1f4a7; 【 R a b b i t M Q 教程】第五章—— R a b b i t M Q − 死信队列 \color{#FF1493}{【RabbitMQ教程】第五章 —— RabbitMQ - 死信队列} 【RabbitMQ教程】第五章——RabbitMQ−死信队列&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人…

SpringCloud:分布式事务Seata

1.什么是分布式事务 分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上&#xff0c;简单的说&#xff0c;就是一次大的操作由不同的小操作组成&#xff0c;这些小的操作分布在不同的服务器上&#xff0c;且属…

【Flutter】Flutter 创建每个页面公用的底部框

文章目录 一、 前言二、 创建公用底部框的步骤1. 创建一个公用的底部框 Widget2. 在页面中使用公用的底部框 Widget 三、 示例&#xff1a;电商应用中的公用底部框1. 创建电商应用的底部框 Widget2. 在电商应用的各个页面中使用底部框 Widget 四、 完整代码示例五、 一些注意事…

第一次ubuntu wsl ssh远程登录各种报错+解决

第一次ubuntu wsl ssh远程登录各种报错+解决 最新推荐文章于 2023-04-13 20:23:43 发布 kh3064 于 2020-11-03 15:12:16 发布 1869 收藏 5 文章标签: ubuntu

计算理论导引实验三:构造图灵机

计算理论导引实验三&#xff1a;构造图灵机 实验描述形式化定义图灵机M的状态图 算法设计与描述状态转移关系类键盘输入及逻辑处理类 编码实现测试运行 实验描述 要求构造一个能够识别语言L的图灵机。语言L的描述和实验内容如下图所示 形式化定义 根据实验描述&#xff0c;可…

【批量修改后缀名】如何批量去修改文件后缀名(亲测图文结合)

【写在前面】前段时间&#xff0c;因为素材需要&#xff0c;就去之前我制作相册的一个网站上下载了一批照片&#xff0c;但是照片下载下来的格式居然是.png!600*0&#xff0c;这种格式的也打不开&#xff0c;于是乎我自己就吭哧吭哧的去一个个的修改&#xff0c;然后我一想他娘…

EBU5476 Microprocessor System Design 知识点总结_5 GPIO

GPIO General Purpose Input Output, Memory-Mapped IO 把设备&#xff0c;控制等寄存器映射到内存里。好处就是访问设备方式和内存一样&#xff0c;也不用设计复杂的IO电路&#xff0c;便捷&#xff1b;缺点在于占用了内存空间。 Peripheral-Mapped IO IO有一块专门的存储…

Vue|单文件组件与脚手架安装

一、单文件组件1.1 介绍1.2 文件组成1.3 加深认知 二、脚手架安装2.1 什么是脚手架?2.2 使用镜像2.3 全局安装vue/cli2.4 创建并启动项目 一、单文件组件 1.1 介绍 [.vue]文件&#xff0c;称为单文件组件&#xff0c;是Vue.js自定义的一种文件格式&#xff0c;一个.vue文件就…

AST使用(二)

//在此之前&#xff0c;先了解下path和node/*path指的是路径 其常用的方法当前路径所对应的源代码 : path.toString判断path是什么type&#xff0c;使用path.isXXX 这个方法 : if(path.isStringLiteral()){}获取path的上一级路径 : let parent path.parentPath;获取path的子…

nginx的安装及代理和负载均衡设置

一、通过yum方式进行安装 官网参考地址&#xff1a;https://nginx.org/en/linux_packages.html#RHEL 1.1 安装好依赖 执行下面的命令安装 sudo yum install yum-utils1.2、 先配置好yum源 新建文件/etc/yum.repos.d/nginx.repo&#xff0c;文件内容&#xff1a; [nginx-s…

一个成熟的软件测试工程师应该具备那些“技能”

1、良好的沟通 相信大家都在网上看到过各种吐槽程序员不解风情的段子&#xff0c;开怀大笑之余深思&#xff0c;作为一个测试工程师又何尝不是如此&#xff1f;通常沟通技能成为横亘在测试工程师与其他合作部门之间的万丈鸿沟&#xff0c;也成为测试工程师成长的最大瓶颈。下面…

Vector-常用CAN工具 - 以太网报文收发方向

目录 Rx 和 Tx 标记 Example&#xff1a;从 CANoe 向 ECU 发送以太网数据包 用例 2&#xff1a;从 ECU 接收以太网数据包 如何仅显示物理或虚拟通信 如何仅显示 Rx 或 Tx 以太网数据包 VN5000以太网包过滤 1、什么是硬件过滤&#xff1f; 2、什么时候使用硬件过滤&…

useEffect,useLayoutEffect的基础知识和底层机制

useEffect 是 React 中一个重要的 Hook&#xff0c;用来处理组件的副作用操作。它的基础知识包括两个方面&#xff1a;执行时机和参数。 执行时机&#xff1a; useEff ect 的执行时机包括两种情况&#xff1a; 组件挂载时&#xff0c;即第一次渲染之后。组件更新时&#xff…

智能垃圾分类小程序,流量主变现,外卖cps权益变现,uniCloud云开发无需购买服务器和域名,助力每一位创业者。

技术优势 基于 uniapp uniCloud 研发&#xff0c;无需购买服务器和域名&#xff0c;uniCloud 是 DCloud 联合阿里云、腾讯云 serverless 构建。从此不用关心服务器运维、弹性扩容、大并发承载、防DDoS攻击等&#xff0c;轻松应对高并发应用&#xff0c; 传统小程序开通流量主…

Qt 多语言实现

简介 Qt Linguist 提供了一套加速应用程序翻译和国际化的工具。Qt 使用单一的源码树和单一的应用程序二进制包就可同时支持多个语言和书写系统。 使用 QTranslator 来加载生成的 qm 文件&#xff0c;就可以让程序显示指定的语言。 // 国际化翻译 QString language "CH…