效果
技术
React + TypeScript + Less + Echarts
代码块
import * as echarts from "echarts"; import React, { useEffect, useRef } from "react"; import "echarts-gl"; import "./index.less"; const LeftEcharts = () => { const chartDom = useRef(null); useEffect(() => { const myChart = echarts.init(chartDom.current); // 数据源 const optionsData: any = [ { name: "IT运营管控团队", value: 1000, itemStyle: { color: "#dd4b3d", }, }, { name: "业务支撑团队", value: 600, itemStyle: { color: "#dd9c3c", }, }, { name: "计费结算团队", value: 900, itemStyle: { color: "#f6bb50", }, }, { name: "数据应用运营团队", value: 800, itemStyle: { color: "#5ec7f8", }, }, { name: "Paas组件运营团队", value: 400, itemStyle: { color: "#31dda1", }, }, { name: "云数安全团队", value: 300, itemStyle: { color: "#637aff", }, }, ]; // 生成扇形的曲面参数方程,用于 series-surface.parametricEquation function getParametricEquation( startRatio, endRatio, isSelected, isHovered, k, h ) { // 计算 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, v) { 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, v) { 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, v) { 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) { let series: any = []; let sumValue = 0; let startValue = 0; let endValue = 0; let legendData: any = []; let k = typeof internalDiameterRatio !== "undefined" ? (1 - internalDiameterRatio) / (1 + internalDiameterRatio) : 1 / 3; // 为每一个饼图数据,生成一个 series-surface 配置 for (let i = 0; i { // 格式化提示框内容 if ( params.seriesName !== "mouseoutSeries" && params.seriesName !== "pie2d" // 排除特定系列 ) { return `${params.seriesName }
${option.series[params.seriesIndex].pieData.value + "万人" }`; // 返回系列名称和数值 } }, }, labelLine: { show: true, // 显示标签连接线 lineStyle: { color: "#7BC0CB", // 标签连接线颜色 }, normal: { show: true, // 正常状态显示 length: 10, // 连接线长度 length2: 10, // 连接线第二段长度 }, }, label: { show: true, // 显示标签 position: "outside", // 标签位置 formatter: "{b} n{c}n{d}%", // 标签格式 textStyle: { color: "rgba(176, 216, 223, 1)", // 标签文本颜色 fontSize: 24, // 标签字体大小 }, }, xAxis3D: { min: -1, // x轴最小值 max: 1, // x轴最大值 }, yAxis3D: { min: -1, // y轴最小值 max: 1, // y轴最大值 }, zAxis3D: { min: -1, // z轴最小值 max: 1, // z轴最大值 }, grid3D: { show: false, // 是否显示3D网格 boxHeight: 1, // 3D盒子的高度 left: -40, // 3D图形左边距 top: -10, // 3D图形顶部边距 width: "50%", // 3D图形宽度 viewControl: { distance: 280, // 视距 alpha: 20, // 视角的俯仰角 beta: 15, // 视角的旋转角 autoRotate: true, // 是否自动旋转 rotateSensitivity: 1, // 旋转灵敏度 zoomSensitivity: 0, // 缩放灵敏度 panSensitivity: 0, // 平移灵敏度 }, }, series: series, // 数据系列 }; myChart.setOption(option); }, []); return (); }; export default LeftEcharts;团队概况
总结
到此这篇关于React中如何使用echarts写出3d旋转扇形图的文章就介绍到这了,更多相关React echarts写3d旋转扇形图内容请搜索IT俱乐部以前的文章或继续浏览下面的相关文章希望大家以后多多支持IT俱乐部!