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.pswp.cn/news/718963.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/718963.shtml
英文地址,請注明出處:http://en.pswp.cn/news/718963.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

社情民意調查的內容

本文由群狼調研&#xff08;長沙社情民意調查&#xff09;出品&#xff0c;歡迎轉載&#xff0c;請注明出處。社情民意調查的內容通常包括以下幾個方面&#xff1a; 1.社會熱點問題&#xff1a;針對當前社會熱點問題進行調查&#xff0c;收集公眾對該問題的態度和看法&#xf…

羊大師揭秘羊奶與健康,美味的保健佳品

羊大師揭秘羊奶與健康&#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的…

Hierarchical Text-ConditionalImage Generation with CLIP Latents筆記

1 Title Hierarchical Text-Conditional Image Generation with CLIP Latents&#xff08;Aditya Ramesh、Prafulla Dhariwal、Alex Nichol、Casey Chu、Mark Chen&#xff09; 2 Conclusion Contrastive models like CLIP have been shown to learn robust representations …

read()函數

read() 函數用于從文件描述符&#xff08;通常是套接字、文件等&#xff09;讀取數據。 #include <unistd.h>ssize_t read(int fd, void *buf, size_t count);fd&#xff1a; 是文件描述符&#xff0c;可以是套接字、文件等。 buf&#xff1a; 是一個指向要讀取數據的緩…

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;運用軟件工程原理和開發方法…

js跳出循環

只有for可以自己跳出循環 break可以退出多重循環&#xff0c;可以自行選擇退出哪一層 label: for (let i 0; i < arr.length; i) {if (arr[i].content) {break label}console.log(i) } label1: for (let i 0; i < arr.length; i) {label2: for (let j 0; j < arr.l…

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;在沙箱環境…

項目管理,如何做到流程標準化?

在項目管理的流程中&#xff0c;每個階段都有自己的起止范圍&#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…