echarts如何实现3D饼图(环形图)?

一、实现的效果

二、具体步骤

1.安装依赖

npm install echarts 

2.引入echarts

import * as echarts from 'echarts';

 注意:这里需要用到echarts-gl,必须单独引入才可以

import 'echarts-gl';

3.echarts部分代码

我知道这部分内容很多,但只要cv去用就可以了,getParametricEquation这个函数不用改(我也不知道咋改。。。反正我没动过);getPie3D函数根据自己的需求稍微改一下option配置就好,其余的可以不用管

 // 颜色列表const colorList = ['rgba(76, 139, 241, 0.9)','rgba(101, 193, 241, 0.9)','rgba(249, 215, 114, 0.9)','rgba(179, 186, 195, 0.9)','rgba(255, 255, 255,  0.9)','rgba(145, 186, 217, 0.9)',];// 生成扇形的曲面参数方程,用于 series-surface.parametricEquationfunction getParametricEquation(startRatio: any, endRatio: any, isSelected: any, isHovered: any, k: any, h: any) {// 计算let midRatio = (startRatio + endRatio) / 2;let startRadian = startRatio * Math.PI * 2;let endRadian = endRatio * Math.PI * 2;let midRadian = midRatio * Math.PI * 2;// 如果只有一个扇形,则不实现选中效果。// if (startRatio === 0 && endRatio === 1) {//     isSelected = false;// }isSelected = false;// 通过扇形内径/外径的值,换算出辅助参数 k(默认值 1/3)k = typeof k !== 'undefined' ? k : 1 / 3;// 计算选中效果分别在 x 轴、y 轴方向上的位移(未选中,则位移均为 0)let offsetX = isSelected ? Math.sin(midRadian) * 0.1 : 0;let offsetY = isSelected ? Math.cos(midRadian) * 0.1 : 0;// 计算高亮效果的放大比例(未高亮,则比例为 1)let 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: function (u: any, v: any) {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: function (u: any, v: any) {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: function (u: any, v: any) {if (u < -Math.PI * 0.5) {return Math.sin(u);}if (u > Math.PI * 2.5) {return Math.sin(u) * h * 0.1;}return Math.sin(v) > 0 ? 1 * h * 0.1 : -1;},};}// 生成模拟 3D 饼图的配置项function getPie3D(pieData: any, internalDiameterRatio: any) {let series = [];let sumValue = 0;let startValue = 0;let endValue = 0;let legendData = [];let k = typeof internalDiameterRatio !== 'undefined' ? (1 - internalDiameterRatio) / (1 + internalDiameterRatio) : 1 / 3;// 为每一个饼图数据,生成一个 series-surface 配置for (let i = 0; i < pieData.length; i++) {sumValue += pieData[i].value;let seriesItem: any = {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: 1 / 10,},};if (typeof pieData[i].itemStyle != 'undefined') {let itemStyle: any = {};typeof pieData[i].itemStyle.color != 'undefined' ? (itemStyle.color = pieData[i].itemStyle.color) : null;typeof 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,也就是实现每一个扇形。for (let i = 0; i < series.length; i++) {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,series[i].pieData.value);startValue = endValue;legendData.push(series[i].name);}series.push({name: 'mouseoutSeries',type: 'surface',parametric: true,wireframe: {show: false,},itemStyle: {opacity: 0.2,color: 'rgba(165, 247, 253, 1)',},parametricEquation: {u: {min: 0,max: Math.PI * 2,step: Math.PI / 20,},v: {min: 0,max: Math.PI / 4,step: Math.PI / 20,},x: function (u: any, v: any) {return ((Math.sin(v) * Math.sin(u) + Math.sin(u)) / Math.PI) * 2.5;},y: function (u: any, v: any) {return ((Math.sin(v) * Math.cos(u) + Math.cos(u)) / Math.PI) * 2.5;},z: function (u: any, v: any) {return Math.cos(v) > 0 ? -3 : -3;},},});// 准备待返回的配置项,把准备好的 legendData、series 传入。let option = {legend: {icon: 'circle',orient: 'vertical',data: pieData.map((dItem: any, dIndex: any) => {return {...dItem,textStyle: {rich: {percent: {color: colorList[dIndex],},},},};}),right: '5%',top: '20%',itemGap: 10,itemWidth: 12,itemHeight: 12,selectedMode: false, // 关闭图例选择textStyle: {color: '#fff',fontSize: 14,fontFamily: 'Source Han Sans CN',rich: {name: {color: '#FFF',fontSize: 18,width: 50,padding: [0, 0, 0, 10],},value: {color: '#2BDFD4',fontSize: 20,width: 50,padding: [0, 0, 0, 20],},percent: {color: '#2BDFD4',fontSize: 24,padding: [0, 0, 0, 20],},unit: {color: '#ACDCE4',fontSize: 24,padding: [0, 0, 0, 5],},},},formatter: (name: any) => {let obj = pieData.find((item: any) => item.name === name);let datas = pieData;let total = 0;let target = obj.value;for (let i = 0; i < datas.length; i++) {total += Number(datas[i].value);}const arr = [`{name|${name}}{value|${obj.value}次}{percent|${((target / total) * 100).toFixed(0)}}{unit|%}`];return arr.join('');},},xAxis3D: {},yAxis3D: {},zAxis3D: {},grid3D: {viewControl: {autoRotate: true, // 自动旋转},left: '4%',width: '45%',show: false,boxHeight: 30,// boxWidth和boxDepth这两个属性值保持一致,才可以在调整饼图宽度的时候保持水平,不然就会歪歪扭扭boxWidth: 130,boxDepth: 130,},series: series,};return option;}const data = [{name: 'PM2.5',value: 134,},{name: 'VOC',value: 56,},{name: 'T',value: 57,},{name: 'CH2O',value: 36,},{name: 'CO2',value: 51,},{name: 'RH',value: 51,},];const serData = data.map((dItem, index) => {return {...dItem,value: Number(dItem.value),itemStyle: {color: colorList[index],},};});// 传入数据生成 optionlet option = getPie3D(serData, 0.7);

 

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

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

相关文章

羊大师揭秘羊奶与健康,美味的保健佳品

羊大师揭秘羊奶与健康&#xff0c;美味的保健佳品 羊奶确实是一种美味且健康的保健佳品&#xff0c;其独特的营养成分和风味使其成为许多人的健康选择。以下是一些羊奶与健康的关系&#xff1a; 营养丰富&#xff1a;羊奶含有丰富的蛋白质、脂肪、矿物质和维生素&#xff0c;…

ruoyi-nbcio-plus的Vue3前端升级组件后出现的问题(一)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a; http://122.227.135.243:9666 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; https://gitee.com/nbach…

大模型ChatGLM-6B实现本地部署

大模型ChatGLM-6B实现本地部署 一、写在前面&#xff1a;二、ChatGLM-6B下载&#xff1a;三、项目所需要的环境配置&#xff1a;四、项目运行&#xff1a;五、遇到的主要问题及解决 一、写在前面&#xff1a; 1、 确保你的电脑中已安装git&#xff0c;git lfs。 2、确保你的电…

浅析前端的堆栈原理以及深浅拷贝原理

浅析前端的堆栈原理以及深浅拷贝原理 首先来看一个案例 const obj {name:hzw,age:18 } let objName2 obj objName2.age 12 console.log(obj,objName2) // {name: hzw, age: 12} {name: hzw, age: 12}这里是不是很奇怪&#xff0c;为什么&#xff0c;为什么我改变objName2的…

AirPods Pro 2 耳机推送新固件,苹果Find My功能助力产品成长

苹果公司面向 AirPods Pro 2&#xff08;包括 USB-C 和 Lightning 版本&#xff09;&#xff0c;推出了全新的测试版固件更新&#xff0c;版本号为 6E188&#xff0c;高于 12 月份发布的 6B34 固件。 苹果和往常一样&#xff0c;并没有提供详细的更新日志或者说明&#xff0c…

算法刷题day20:二分

目录 引言概念一、借教室二、分巧克力三、管道四、技能升级五、冶炼金属六、数的范围七、最佳牛围栏 引言 这几天一直在做二分的题&#xff0c;都是上了难度的题目&#xff0c;本来以为自己的二分水平已经非常熟悉了&#xff0c;没想到还是糊涂了一两天才重新想清楚&#xff0…

力扣区间题:合并区间、插入区间

我们可以将区间按照左端点升序排列&#xff0c;然后遍历区间进行合并操作。 我们先将第一个区间加入答案&#xff0c;然后依次考虑之后的每个区间&#xff1a; 如果答案数组中最后一个区间的右端点小于当前考虑区间的左端点&#xff0c;说明两个区间不会重合&#xff0c;因此…

Java基于springboot的课程作业管理系统

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;课程作业管理系统当然也不能排除在外。课程作业管理系统是以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法…

Linux常见命令总结

1.创建文件夹 mkdir 目录名 mkdir 文件夹名 创建单个文件夹 mkdir 文件夹1 文件夹2 文件夹3 创建多个文件夹 mkdir -p parent/child 创建多级文件夹 2.创建文件 touch 文件名 touch的主要功能有两个,如果要创建的文件的名称存在,将文件的创建时间修改到当前的系统时间(也…

五种常用的可视化项目管理工具

传统的项目管理通常依赖于文本文档&#xff0c;容易造成误解和混乱。在快节奏的商业环境中&#xff0c;没有哪个项目经理愿意处理繁重的文档流程。 另一方面&#xff0c;可视化项目管理通常使用图表和视觉板来展示复杂的项目信息。因此&#xff0c;项目经理能快速了解关键信息…

基于 rk3566 的 uboot 分析 - dts 加载和 dm 模型的本质

文章目录 一、设备树加载使用1、概述2、第一阶段1) fdtdec_setup2) 总结 3、第二阶段1) kernle dtb 编译打包2) 加载流程2.1) board_init2.2) init_kernel_dtb2.3) rockchip_read_dtb_file2.4) rockchip_read_resource_dtb 3) 总结 二、dm 模型1、树的创建1) device_bind_commo…

使用Matlab计算IGRAv2探空站的Tm和PWV

1. 探空站IGRAv2数据 探空站的Tm常作为真值&#xff0c;去检验Tm线性公式或者ERA5 Tm等的精度 。 探空站PWV常作为真值&#xff0c;去检验GNSS PWV等的精度 2. Tm 的计算方法 Tm 的计算方法有两种在前面的文章有讲&#xff0c;这里用 使用水汽压和温度计算Tm。 ei和 Ti 表示…

本地如何配置支付宝模拟支付场景并结合内网穿透实现公网环境调试开发?

文章目录 前言1. 下载当面付demo2. 修改配置文件3. 打包成web服务4. 局域网测试5. 内网穿透6. 测试公网访问7. 配置二级子域名8. 测试使用固定二级子域名访问 前言 在沙箱环境调试支付SDK的时候&#xff0c;往往沙箱环境部署在本地&#xff0c;局限性大&#xff0c;在沙箱环境…

还在犹豫学不学?鸿蒙技术是否有前途的最强信号来了

2024年3月3日 上午10 点&#xff0c;深圳官方账号发布了一篇关于鸿蒙技术发展的重要文章&#xff0c;看到这篇文章后我非常激动&#xff0c;忍不住和大家分享一下&#xff01; 华为鸿蒙系统自提出以来&#xff0c;网友们的态度各不相同&#xff0c;有嘲笑“安卓套壳”的&#…

2024 CHINASHOP丨悠络客AI应用亮点抢鲜看,还有价值百元门票免费送哦!

3月13日-15日&#xff0c;备受国内外关注的第二十四届中国零售业博览会&#xff08;2024 CHINASHOP&#xff09;将在上海国家会展中心正式开展&#xff01;悠络客作为深耕智慧门店15年的公有云人工智能企业&#xff0c;也将带着全新AI产品和智慧门店解决方案亮相展会&#xff0…

Windows系统中ollama下载模型前设置下载路径

Windows系统中ollama下载模型前设置下载路径 一开始设置了用户环境变量 OLLAMA_MODELS&#xff0c;没有效果 添加系统环境变量后&#xff0c;ollama pull和run的模型都到了环境变量中的路径下&#xff1b; 设置完后可以在cmd中检查一下&#xff1a;echo %ollama_models% ollam…

Electron 多显示器渲染

Electron打出的包&#xff0c;如果当前有俩个显示器&#xff0c;则可以配置当前显示倒哪个显示器上&#xff0c;或者可以配置不同的显示器&#xff0c;启动不同的项目&#xff0c;只在Windows和Linux下测试过&#xff0c;Mac没有真机&#xff0c;可以利用docker安装MacOS环境&a…

使用mapbox navigation搭建一个安卓导航 示例

一.代码示例地址&#xff1a; https://github.com/mapbox/mapbox-navigation-android-examples/tree/main 二. 具体步骤&#xff1a; git clone gitgithub.com:mapbox/mapbox-navigation-android-examples.git Go to app/src/main/res/values Look for mapbox_access_token.…

Sora:探索大型视觉模型的前世今生、技术内核及未来趋势

Sora&#xff0c;一款由OpenAI在2024年2月推出的创新性文生视频的生成式AI模型&#xff0c;能够依据文字说明&#xff0c;创作出既真实又富有想象力的场景视频&#xff0c;展现了其在模拟现实世界方面的巨大潜能。本文基于公开技术文档和逆向工程分析&#xff0c;全面审视了Sor…

pytorch(四)用pytorch实现线性回归

文章目录 代码过程准备数据设计模型设计构造函数与优化器训练过程训练代码和结果pytorch中的Linear层的底层原理&#xff08;个人喜欢&#xff0c;不用看&#xff09;普通矩阵乘法实现Linear层实现 回调机制 代码过程 训练过程&#xff1a; 准备数据集设计模型&#xff08;用来…