当前位置: 首页 > news >正文

echarts-pie---------3D曲状环形饼图实现!!!

示例(参考此处饼图修改https://www.isqqw.com/viewer?id=37497)

在这里插入图片描述

话不多说直接上代码

此套代码可以直接再echarts官网中的此处运行

在这里插入图片描述

let selectedIndex = '';
let hoveredIndex = '';
option = getPie3D([{name: '数学',value: 60,itemStyle: {color: '#1890FF',},},{name: '难啊',value: 44,itemStyle: {color: '#1EE7E7',},},],0.9    // 可做为调整内环大小
);
// 生成扇形的曲面参数方程
function getParametricEquation(startRatio, endRatio, isSelected, isHovered, k, h) {// 计算const midRatio = (startRatio + endRatio) / 2;const startRadian = startRatio * Math.PI * 2;const endRadian = endRatio * Math.PI * 2;const midRadian = midRatio * Math.PI * 2;// 如果只有一个扇形,则不实现选中效果。if (startRatio === 0 && endRatio === 1) {// eslint-disable-next-line no-param-reassignisSelected = false;}// 通过扇形内径/外径的值,换算出辅助参数 k(默认值 1/3)// eslint-disable-next-line no-param-reassignk = typeof k !== 'undefined' ? k : 1 / 3;// 计算选中效果分别在 x 轴、y 轴方向上的位移(未选中,则位移均为 0)const offsetX = isSelected ? Math.cos(midRadian) * 0.1 : 0;const offsetY = isSelected ? Math.sin(midRadian) * 0.1 : 0;// 计算高亮效果的放大比例(未高亮,则比例为 1)const hoverRate = isHovered ? 1.05 : 1;  // 可以做为调整外环大小// 返回曲面参数方程return {u: {min: -Math.PI,max: Math.PI * 3,step: Math.PI / 32,},v: {min: 0,max: Math.PI * 2,step: Math.PI / 20,},x(u, v) {if (u < startRadian) {return offsetX + Math.cos(startRadian) * (1 + Math.cos(v) * k) * hoverRate;}if (u > endRadian) {return offsetX + Math.cos(endRadian) * (1 + Math.cos(v) * k) * hoverRate;}return offsetX + Math.cos(u) * (1 + Math.cos(v) * k) * hoverRate;},y(u, v) {if (u < startRadian) {return offsetY + Math.sin(startRadian) * (1 + Math.cos(v) * k) * hoverRate;}if (u > endRadian) {return offsetY + Math.sin(endRadian) * (1 + Math.cos(v) * k) * hoverRate;}return offsetY + Math.sin(u) * (1 + Math.cos(v) * k) * hoverRate;},z(u, v) {// if (u < -Math.PI * 0.5) {//     return Math.sin(u);// }// if (u > Math.PI * 2.5) {//     return Math.sin(u) * h * 0.1;// }// 当前图形的高度是Z根据h(每个value的值决定的)return 1.3 * Math.sin(v)// return Math.sin(v) > 0 ? 1 * h * 0.1 : -1;},};
}
// 生成模拟 3D 饼图的配置项
function getPie3D(pieData, internalDiameterRatio) {const series = [];// 总和let sumValue = 0;let startValue = 0;let endValue = 0;const legendData = [];const k =typeof internalDiameterRatio !== 'undefined'? (1 - internalDiameterRatio) / (1 + internalDiameterRatio): 1 / 3;// 为每一个饼图数据,生成一个 series-surface 配置for (let i = 0; i < pieData.length; i += 1) {sumValue += pieData[i].value;const seriesItem = {name: typeof pieData[i].name === 'undefined' ? `series${i}` : pieData[i].name,type: 'surface',parametric: true,wireframe: {show: false,},pieData: pieData[i],pieStatus: {selected: false,hovered: false,k,},};if (typeof pieData[i].itemStyle !== 'undefined') {const { itemStyle } = pieData[i];// eslint-disable-next-line no-unused-expressionstypeof pieData[i].itemStyle.color !== 'undefined' ? (itemStyle.color = pieData[i].itemStyle.color) : null;// eslint-disable-next-line no-unused-expressionstypeof pieData[i].itemStyle.opacity !== 'undefined'? (itemStyle.opacity = pieData[i].itemStyle.opacity): null;seriesItem.itemStyle = itemStyle;}series.push(seriesItem);}// 使用上一次遍历时,计算出的数据和 sumValue,调用 getParametricEquation 函数,// 向每个 series-surface 传入不同的参数方程 series-surface.parametricEquation,也就是实现每一个扇形。console.log(series);for (let i = 0; i < series.length; i += 1) {endValue = startValue + series[i].pieData.value;series[i].pieData.startRatio = startValue / sumValue;series[i].pieData.endRatio = endValue / sumValue;series[i].parametricEquation = getParametricEquation(series[i].pieData.startRatio,series[i].pieData.endRatio,false,false,k,// 我这里做了一个处理,使除了第一个之外的值都是10series[i].pieData.value === series[0].pieData.value ? 10 : 10);startValue = endValue;legendData.push(series[i].name);}// 准备待返回的配置项,把准备好的 legendData、series 传入。const option = {legend:{show: true},title: {text: '3D 曲状饼图展示',x: 'center',top:170,textStyle: {color: '#000',fontSize: 14,}},// animation: false,tooltip: {formatter: (params) => {if (params.seriesName !== 'mouseoutSeries') {return `${params.seriesName}<br/><span style="display:inline-block;margin-right:5px;border-radius:10px;width:10px;height:10px;background-color:${params.color};"></span>${option.series[params.seriesIndex].pieData.value}`;}return '';},},xAxis3D: {min: -1,max: 1,},yAxis3D: {min: -1,max: 1,},zAxis3D: {min: -1,max: 1,},grid3D: {show: false,boxHeight: 5,top: '-20%',viewControl: {// 3d效果可以放大、旋转等,请自己去查看官方配置alpha: 20,// beta: 30,rotateSensitivity: 1,zoomSensitivity: 0,panSensitivity: 0,autoRotate: true,distance: 300,},// 后处理特效可以为画面添加高光、景深、环境光遮蔽(SSAO)、调色等效果。可以让整个画面更富有质感。postEffect: {// 配置这项会出现锯齿,请自己去查看官方配置有办法解决enable: false,bloom: {enable: true,bloomIntensity: 0.1,},SSAO: {enable: true,quality: 'medium',radius: 2,},// temporalSuperSampling: {//   enable: true,// },},},series,};return option;
}
// //  修正取消高亮失败的 bug
// // 监听 mouseover,近似实现高亮(放大)效果
// option.title.text = option.series[0].name + ' '+option.series[0].pieData.value
// function handleOver(params) {
//         // 准备重新渲染扇形所需的参数
//     let isSelected;
//     let isHovered;
//     let startRatio;
//     let endRatio;
//     let k;
//     let i;//     // 如果触发 mouseover 的扇形当前已高亮,则不做操作
//     if (hoveredIndex === params.seriesIndex) {
//         return;//         // 否则进行高亮及必要的取消高亮操作
//     } else {
//         // 如果当前有高亮的扇形,取消其高亮状态(对 option 更新)
//         if (hoveredIndex !== '') {
//             // 从 option.series 中读取重新渲染扇形所需的参数,将是否高亮设置为 false。
//             isSelected = option.series[hoveredIndex].pieStatus.selected;
//             isHovered = false;
//             startRatio = option.series[hoveredIndex].pieData.startRatio;
//             endRatio = option.series[hoveredIndex].pieData.endRatio;
//             k = option.series[hoveredIndex].pieStatus.k;
//             i = option.series[hoveredIndex].pieData.value === option.series[0].pieData.value ? 35 : 10;
//             // 对当前点击的扇形,执行取消高亮操作(对 option 更新)
//             option.series[hoveredIndex].parametricEquation = getParametricEquation(
//                 startRatio,
//                 endRatio,
//                 isSelected,
//                 isHovered,
//                 k,
//                 i
//             );
//             option.series[hoveredIndex].pieStatus.hovered = isHovered;//             // 将此前记录的上次选中的扇形对应的系列号 seriesIndex 清空
//             hoveredIndex = '';
//         }//         // 如果触发 mouseover 的扇形不是透明圆环,将其高亮(对 option 更新)
//         if (params.seriesName !== 'mouseoutSeries') {
//              option.title.text=' ' +option.series[seriesIndex].name + ' ' + option.series[params.seriesIndex].pieData.value
//             // 从 option.series 中读取重新渲染扇形所需的参数,将是否高亮设置为 true。
//             isSelected = option.series[params.seriesIndex].pieStatus.selected;
//             isHovered = true;
//             startRatio = option.series[params.seriesIndex].pieData.startRatio;
//             endRatio = option.series[params.seriesIndex].pieData.endRatio;
//             k = option.series[params.seriesIndex].pieStatus.k;//             // 对当前点击的扇形,执行高亮操作(对 option 更新)
//             option.series[params.seriesIndex].parametricEquation = getParametricEquation(
//                 startRatio,
//                 endRatio,
//                 isSelected,
//                 isHovered,
//                 k,
//                 option.series[params.seriesIndex].pieData.value + 5
//             );
//             option.series[params.seriesIndex].pieStatus.hovered = isHovered;//             // 记录上次高亮的扇形对应的系列号 seriesIndex
//             hoveredIndex = params.seriesIndex;
//         }//         // 使用更新后的 option,渲染图表
//         myChart.setOption(option);
//     }
// }
// myChart.on('mouseover', function (params) {
//     handleOver(params)
// });// function handleOut() {
//        if (hoveredIndex !== '') {
//         // 从 option.series 中读取重新渲染扇形所需的参数,将是否高亮设置为 true。
//         isSelected = option.series[hoveredIndex].pieStatus.selected;
//         isHovered = false;
//         k = option.series[hoveredIndex].pieStatus.k;
//         startRatio = option.series[hoveredIndex].pieData.startRatio;
//         endRatio = option.series[hoveredIndex].pieData.endRatio;
//         // 对当前点击的扇形,执行取消高亮操作(对 option 更新)
//         i = option.series[hoveredIndex].pieData.value === option.series[0].pieData.value ? 35 : 10;
//         option.series[hoveredIndex].parametricEquation = getParametricEquation(
//             startRatio,
//             endRatio,
//             isSelected,
//             isHovered,
//             k,
//             i
//         );
//         option.series[hoveredIndex].pieStatus.hovered = isHovered;//         // 将此前记录的上次选中的扇形对应的系列号 seriesIndex 清空
//         hoveredIndex = '';
//     }//     // 使用更新后的 option,渲染图表
//     myChart.setOption(option);
// }
// // 修正取消高亮失败的 bug
// myChart.on('globalout', function () {
//     handleOut()
// });
// console.log(option)
// let seriesIndex = 0 
// setInterval(() => {
//     handleOver({seriesIndex:seriesIndex})
//     seriesIndex++
//     if (seriesIndex === option.series.length) {
//         seriesIndex = 0
//     }
// }, 3000)

相关文章:

echarts-pie---------3D曲状环形饼图实现!!!

示例&#xff08;参考此处饼图修改https://www.isqqw.com/viewer?id37497&#xff09; 话不多说直接上代码 此套代码可以直接再echarts官网中的此处运行 let selectedIndex ; let hoveredIndex ; option getPie3D([{name: 数学,value: 60,itemStyle: {color: #1890FF,},},{…...

合并两个有序链表(leetcode)

题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]思路 每次递归都会比较当前两个节点的值&#xff0c;选择较小的节点作为合并后的链…...

CAS之AtomicReference原理解析

如果你了解了AtomicInteger的工作原理&#xff0c;或者看了如下文章&#xff0c;知道了AtomicInteger只能对当个int类型共享变量做cas的缺点。 CAS之AtomicInteger原理解析_z275598733的博客-CSDN博客 那么AtomicReference就是来解决这个问题的。原理很类似&#xff0c;只是A…...

JS/JQ实现字符串加密成 HEX(十六进制) 字符串

应用场景&#xff1a; 1、数据传输&#xff1a;在网络通信或数据存储中&#xff0c;将字符串转换为十六进制格式可以确保数据的可靠传输和存储。十六进制字符串只包含数字和字母&#xff0c;而不涉及控制字符或其他特殊字符&#xff0c;因此避免了特殊字符在传输过程中引起的问…...

骨传导耳机怎么样?盘点五款适合室外佩戴的骨传导耳机

不知道各位出去玩的时候&#xff0c;有没有觉得外面的世界太喧嚣&#xff0c;需要一副耳机开启自己的小天地&#xff0c;相信有很多人都有这种习惯&#xff0c;在路上戴着耳机享受属于自己的那一片天地&#xff0c;可是市面上种类这么多耳机&#xff0c;该如何选择呢&#xff0…...

【flink】使用flink-web-ui提交作业报错

使用WebUI提交作业出现错误。 错误截图&#xff1a; 弹框信息&#xff1a; Server Response Message: org.apache.flink.runtime.rest.handler.RestHandlerException: Could not execute application.at org.apache.flink.runtime.webmonitor.handlers.JarRunHandler.lambda$h…...

「从零入门推荐系统」22:chatGPT、大模型在推荐系统中的应用

作者 | gongyouliu 编辑 | gongyouliu 提示&#xff1a;全文2.5万字&#xff0c;预计阅读时长2小时&#xff0c;可以先收藏再慢慢阅读。 我们在上一章介绍了chatGPT、大模型的基本概念、核心技术原理等基础知识&#xff0c;有了这些背景知识的铺垫&#xff0c;下面我们来介绍ch…...

机器学习---概述(一)

文章目录 1.人工智能、机器学习、深度学习2.机器学习的工作流程2.1 获取数据集2.2 数据基本处理2.3 特征工程2.3.1 特征提取2.3.2 特征预处理2.3.3 特征降维 2.4 机器学习2.5 模型评估 3.机器学习的算法分类3.1 监督学习3.1.1 回归问题3.1.2 分类问题 3.2 无监督学习3.3 半监督…...

概念解析 | AutoFed:面向异构数据的联邦多模态自动驾驶的学习框架

AutoFed:面向异构数据的联邦多模态自动驾驶的学习框架 注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:面向异构数据的联邦学习在自动驾驶中的应用。 参考文献:Zheng T, Li A, Chen Z, et al. AutoFed: Heterogeneity-Aware F…...

vue3+uniapp自定义tabbar

首先把tabbar中的元素写在一个list中用v-for进行渲染 用一个interface进行定义接口&#xff0c;这样别人在review你的代码就可以清晰知道你的tabbar包含什么元素。 利用typescript特性进行类型定义&#xff0c;可以省去很多麻烦 import { reactive } from "vue" imp…...

stable diffusion webui 安装

安装环境:cuda10.2-cudnn8-devel-ubuntu18.04 torchtorchvision:[pytorch]pytorch官方安装法_torch1.13.1cu117_FL1623863129的博客-CSDN博客 error&#xff1a;RuntimeError: Couldnt determine Stable Diffusions hash: 69ae4b35e0a0f6ee1af8bb9a5d0016ccb27e36dc. 解决方法…...

csdn文章编辑器必备语法备用

前言 本文是为了记录csdn文章编辑器的必备语法&#xff0c;为写作小白提供更详细的写作规范技巧 csdn的质量分查询地址&#xff1a;质量分查询 这里的跳转链接&#xff0c;可以使用ctrlshift L 来输入链接 亦可以使用 链接: link. &#x1f680;&#x1f680;&#x1f680; &a…...

机器学习鲁棒性笔记

鲁棒性&#xff08;Robustness&#xff09;在统计学和数据分析中是一个重要的概念。它指的是某个统计方法或模型对于异常值或偏离数据集正常分布的情况的敏感程度。一个鲁棒性较好的方法能够在存在异常值或数据分布不符合假设的情况下依然给出可靠的结果&#xff0c;而不会被极…...

ubuntu 有 1 个软件包没有被完全安装或卸载

ubuntu 有 1 个软件包没有被完全安装或卸载&#xff0c;安装时出现问题&#xff0c;一直卡在 rti-connext-dds-5.3.1 安装问题上。 下面是我安装 sqlite3 出现的问题&#xff1a; sukaiG7-7500:~/1/111/workspace_ros_car_noetic$ sudo apt-get install sqlite3 正在读取软件…...

【QT调用ST-link-使用QT编写程序-调用ST-LINK_CLI.exe-烧写STM32F4xxx-基础样例】

【QT结合ST-link&#xff0c;使用QT编写程序&#xff0c;调用ST-LINK_CLI.exe,烧写STM32F4xxx-基础样例】 1、前言2、实验环境3、先前了解-自我总结4、实验过程&#xff08;0&#xff09;硬件连接与供电&#xff08;1&#xff09;安装&使用STM32 ST-LINK Utility&#xff0…...

高并发下的Java项目解决方案

高并发下的Java项目解决方案 在当今的互联网时代&#xff0c;高并发是Java项目在设计和开发过程中必须要考虑的重要因素之一。本文将详细介绍如何在Java项目中处理高并发的问题&#xff0c;并提供具体的解决方案。我们将主要讨论四个主要的主题&#xff1a;服务器扩展&#xf…...

华为推出手机系统云翻新服务:什么是云翻新?如何使用?

华为手机系统云翻新是华为推出的一项功能&#xff0c;旨在通过云服务提供系统翻新的服务。它可以帮助用户对手机的系统进行优化和更新&#xff0c;以提高手机的性能和流畅度。具体而言&#xff0c;华为手机系统云翻新功能提供了免费的云空间&#xff0c;用户可以将手机中的系统…...

修改时间和创建时间的设计问题

记录一次 在django框架开发中遇到问题&#xff1a; 想要的逻辑&#xff1a; 当在保存数据时&#xff0c;create_time字段只会在新建数据时被设置为当前时间&#xff0c;并且之后不会再修改&#xff0c;而modify_time字段在每次保存数据时都会被设置为当前时间也可以为空&…...

CentOS 搭建 Harbor 镜像仓库(图文详解)

本文目录 1. 下载 Harbor 安装包2. 解压3. 修改配置文件4. 安装 Harbor5. 修改 docker 配置6. docker 登录方式7. 访问 Harbor Web 界面8. 创建证书9. 生成证书10. 更新配置11. 网页登录 说明&#xff1a;在搭建 Harbor 镜像仓库之前&#xff0c;虚拟机要先安装 docker 和 dock…...

【云原生】k8s组件架构介绍与K8s最新版部署

个人主页&#xff1a;征服bug-CSDN博客 kubernetes专栏&#xff1a;kubernetes_征服bug的博客-CSDN博客 目录 1 集群组件 1.1 控制平面组件&#xff08;Control Plane Components&#xff09; 1.2 Node 组件 1.3 插件 (Addons) 2 集群架构详细 3 集群搭建[重点] 3.1 mi…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...

若依登录用户名和密码加密

/*** 获取公钥&#xff1a;前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...