1.实现思路

  • Echarts本身没有这类图形,可以使用其扩展echarts-gl进行绘制,echarts-gl曲面图可以完成这类需求
<script src="https://cdn.jsdelivr.net/npm/echarts/dist/echarts.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/echarts-gl/dist/echarts-gl.min.js"></script>
  • 图形分解:这个3D饼图分为3个圆环,每个圆环有6个面,完成这个3D饼图需要绘制3*6=18个面

2.曲面图基本使用

  • echarts-gl曲面图的类别是 surface ,一个series数据对应一个面,面的数据通常通过函数 parametricEquation 进行生成
  • parametricEquation参数说明:共有5个参数(u,v,x,y,z),其中u,v是自变量,u代表水平角度,v代表垂直角度,他们的值是一个区间,并且有step步进,以此融合生成(x,y,z)数据,最后所有生成的(x,y,z)数据就可以绘制出一个曲面
  • parametricEquation实例解析:带经纬度的3D地球,u的范围覆盖水平方向一圈,会生成40条经度线,v的范围覆盖180度,为每条经度绘制20个点,所以会生成 40 * 20 = 800个点,连接这些点,就是一个3D地球
series: [
{
type: 'surface',
parametric: true,
// shading: 'albedo',
parametricEquation: {
u: {
min: -Math.PI,
max: Math.PI,
step: Math.PI / 20
},
v: {
min: 0,
max: Math.PI,
step: Math.PI / 20
},
x: function (u, v) {
return Math.sin(v) * Math.sin(u);
},
y: function (u, v) {
return Math.sin(v) * Math.cos(u);
},
z: function (u, v) {
return Math.cos(v);
}
}
}

3.细节及关键点

  • 前面说到,一个饼图分成好几个圆环,每个圆环需要绘制6个面,但是其实绘制3个面就够了(前,顶,后),其他面因为视角遮挡的问题看不见,无需绘制
  • 缩放控制:zoomSensitivity(缩放灵敏度),默认开启缩放,设为0将关闭此功能
  • 旋转控制:rotateSensitivity(旋转灵敏度),默认开启旋转,设为0将关闭此功能
  • 视角距离:distance,默认200,越远图形显示越小
  • 曲面网格线:wireframe,建议取消展示

4.使用方式

  • 数据格式
var data = [
{
value: 10,name: "百度",color: "#ff9f7e"
},
{
value: 20,name: "谷歌",color: "#06d3c4"
},
{
value: 20,name: "必应",color: "#6173d6"
}
]
  • 引入组件,传入数据
//引入3d饼图
import zyPie3d from '@/components/zy-pie-3d.vue'
<div style="height:400px;">
<zy-pie-3d :data="pie3dData"></zy-pie-3d>
</div>
  • 效果:

5.组件代码:

<template>
<div style="height:100%" ref="pie3d"></div>
</template> <script>
export default{
props: {
data: {
type:Array,
default: function(){
return []
}
},
//内径大小
radius: {
type: Number,
default: 0.7
},
//位置
top: {
type: [Number,String],
default: "-30%"
},
left: {
type: [Number,String],
default: "-15%"
},
//距离
distance: {
type: Number,
default: 170
},
//旋转灵敏度
rotateSensitivity: {
type: Number,
default: 1
},
//缩放灵敏度
zoomSensitivity: {
type: Number,
default: 0
}
},
data(){
return {
myChart: null
}
},
mounted(){
//渲染
this.renderEcharts()
},
watch: {
//监听数据变化
data(){
//渲染
this.renderEcharts()
}
},
methods: {
//渲染
renderEcharts(){
//实例化
if(!this.myChart){
this.myChart = this.$echarts.init(this.$refs.pie3d)
}
var option = {
tooltip: {
formatter: function(e){
return e.seriesName
}
},
legend: {
selectedMode: false,
orient: "vertical",
right: '20%',
top: "center",
textStyle:{
color: "rgba(255,255,255,0.8)",
},//正常状态的文本样式
},
xAxis3D: {
min: -1, max: 1
},
yAxis3D: {
min: -1, max: 1
},
zAxis3D: {
min: 0, max: 1
},
grid3D: {
show: false,
top: this.top,
left: this.left,
width: "100%", height: "100%",
viewControl: {
rotateSensitivity: this.rotateSensitivity,//禁止旋转
zoomSensitivity: this.zoomSensitivity,//禁止缩放
distance: this.distance,//距离,可以用来缩放
}
},
series: this.getPie3DConfig(this.data)
} // 使用刚指定的配置项和数据显示图表。
this.myChart.setOption(option)
},
//生成饼图配置(每个数据想包括开启角度,结束角度,颜色)
getPie3DConfig(data = []){
//计算总数
var total = data.reduce((total,item)=>{
return total += (item.value)
},0)
//为数据添加占比和角度值
var startAngle = 0
var endAngle = 0
var _data = data.map((item,index)=>{
//拷贝数据项
var _item= {...item}
//计算比值和角度
var rotio = item.value / total
//占位角度
var angle = Math.PI * 2 * rotio
//开始角度(上一个项目的结束角度)
startAngle = endAngle
//结束角度(开始角度+占位角度)
if(index >= data.length - 1){
endAngle = Math.PI * 2
}else{
endAngle = startAngle + angle
}
//挂载到数据项中
_item.startAngle = startAngle
_item.endAngle = endAngle
_item.angle = angle
_item.rotio = rotio
//返回新的数据结构
return _item
}) //饼图固定配置项
//高度
var height = 0.1
//内径
var radius = this.radius
//步进
var step = Math.PI*2/1200 //3D饼图配置项合集
var seriesItems = [] //循环数据项,生成绘制曲面的配置
_data.forEach(item=>{
//series配置(一个配置项目绘制一个面,每个数据项至少需要配置2个面) var baseSeries = {
type: 'surface',
name: item.name,
wireframe: {
show: false
},
parametric: true,
} //正面
var seriesItemFront = {
...baseSeries,
parametricEquation: {
u: {
min: item.startAngle,
max: item.endAngle,
step: step
},
v: {
min: 0,
//饼图高度
max: height,
step: height
},
x: function (u, v) {
return Math.sin(u)
},
y: function (u, v) {
return Math.cos(u)
},
z: function (u, v) {
return v
}
},
itemStyle: {
color: item.color
}
} //背面
var seriesItemBack = {
...baseSeries,
parametricEquation: {
u: {
min: item.startAngle,
max: item.endAngle,
step: step
},
v: {
min: 0,
//饼图高度
max: height,
step: height
},
x: function (u, v) {
return radius * Math.sin(u)
},
y: function (u, v) {
return radius * Math.cos(u)
},
z: function (u, v) {
return v;
}
},
itemStyle: {
color: item.color
}
} //上面
var seriesItemAbove = {
...baseSeries,
parametricEquation: {
u: {
min: item.startAngle,
max: item.endAngle,
step: step
},
v: {
min: 0,
max: height,
step: height
},
x: function (u, v) {
if(v==0){
//内圈
return radius * Math.sin(u)
}else{
//外圈
return Math.sin(u);
}
},
y: function (u, v) {
if(v==0){
//内圈
return radius * Math.cos(u)
}else{
//外圈
return Math.cos(u);
}
},
z: function (u, v) {
return height
}
},
itemStyle: {
color: item.color
}
} seriesItems.push(seriesItemFront, seriesItemBack, seriesItemAbove)
})
return seriesItems
}
}
}
</script>

3D饼图的更多相关文章

  1. Flex中的FusionCharts 3D饼图

    1.3D饼图设计源码 <?xml version="1.0" encoding="utf-8"?> <s:Application xmlns: ...

  2. fusioncharts的3D饼图固定大小和角度

    3D饼图的pieRadius和startingAngle属性 pieRadius:饼图的半径 startingAngle:饼图的角度(旋转) 在固定大小的div里面,饼图上如果显示label或者val ...

  3. Highcharts 3D柱形图;Highcharts 堆叠3D柱形图;Highcharts 3D饼图;Highcharts 3D圆环图

    Highcharts 3D柱形图 配置 chart.options3d 配置 以下列出了 3D 图的基本配置,设置 chart 的 type 属性为 column,options3d 选项可设置三维效 ...

  4. 读取数据库数据,并将数据整合成3D饼图在jsp中显示

    首先我将生成饼图的方法独立写成一个PieChar.java类,详细代码如下:(数据库需要自己建,如有需要的话) import java.io.IOException; import java.sql. ...

  5. FusionCharts参数说明-----3D饼图属性(Pie3D.swf )

    animation 是否显示加载图表时的动画 palette 内置的图表样式,共5个 paletteColors 自定义图表元素颜色(为多个,如过过少会重复) showAboutMenuItem 右键 ...

  6. FusionCharts参数说明——3D饼图属性(Pie3D.swf )

    animation 是否显示加载图表时的动画palette 内置的图表样式,共5个paletteColors 自定义图表元素颜色(为多个,如过过少会重复)showAboutMenuItem 右键是否显 ...

  7. JFreeChart 使用一 饼图之高级特性

    原文链接:http://www.cnblogs.com/jtmjx/archive/2013/04/23/jfreechart_advantage.html 本文主要讲解JFreeChart中饼图的一 ...

  8. struts2整合JFreechart 饼图、折线图、柱形图

    struts2整合JFreechart 饼图.折线图.柱形图 上效果图: 当然可以将数据导出图片格式存储.具体下的链接里的文件有保存成图片的操作. 因为是strust2整合JFreechart,所以s ...

  9. FusionCharts多数据验证饼图label是否重叠

    昨天,有人问我一个问题:由于饼图的数据太多,label标签上的汉字过多,导致重叠,该怎么解决? 今天我用大量的数据,label标签的字符也很多,但是通过验证没有发现有重叠的情况啊! 1.验证的JSP页 ...

  10. c# Aspose.Words插入饼图PieChart

    private static void Main(string[] args) { Document doc = new Document(); DocumentBuilder builder = n ...

随机推荐

  1. AI工具合集

    以下工具来源于互联网,可能会失效,请参考使用 网红工具 名称 链接 说明   GPT-4 https://chat.openai.com/ 需要梯子,需要付费.功能最强大的聊天机 器人. 文心一言 h ...

  2. 击败全球上千参赛队伍,合合信息获ICDAR“文本篡改检测”赛道冠军

    AI技术的快速发展激发了人们对于美好未来的畅享,也带来了潜在的危机,数据泄露.电信诈骗等系列风险与隐患开始浮出水面.利用科技手段构建可信的技术发展环境,保护使用者的信息及财产安全,正在成为行业共识. ...

  3. 图解MQTT概念、mosquitto编译和部署 ,写代码,分别使用外网和本地服务器进行测试

    前沿提要: MQTT是什么不知道? 看这一篇:https://www.cnblogs.com/happybirthdaytoyou/p/10362336.html 阿里云官网玩不转? 看这一篇: ht ...

  4. 76.最小覆盖子串 Golang实现

    题目描述: 给你一个字符串 s .一个字符串 t .返回 s 中涵盖 t 所有字符的最小子串.如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" . 注意: 对于 t ...

  5. 课时05:Linux必备系统命令

  6. std::vector 和 std::map 都支持以下比较运算符

    在 C++ 标准库中,std::vector 和 std::map 都支持以下比较运算符: ==(相等运算符) !=(不等运算符) <(小于运算符) <=(小于等于运算符) >(大于 ...

  7. go语言中变量的作用域

    Go 语言中的变量作用域规则决定了变量在程序的哪些部分是可见的和可以访问的.理解这些规则对于编写清晰.维护性高的代码非常重要.下面是一个系统性的解释. 变量的作用域类型 包级作用域: 包级作用域的变量 ...

  8. iOS 14 UIDatePicker适配问题,使用老的选择器样式

    iOS 14 UIDatePicker 在 13.4 新增了2个属性如下 @property (nonatomic, readwrite, assign) UIDatePickerStyle pref ...

  9. 43.v-if和v-for的优先级

    v-for 的优先级高 延申问题:v-for 和 v-if 为什么不能在一起使用 ? 会造成性能的浪费,因为v-for 的优先级高,所以每次渲染都会执行v-if 判断条件,浪费时间 :比如 渲染 10 ...

  10. kotlin更多语言结构——>操作符重载

    Kotlin允许我们为自己的类型提供预定义的一组操作符的实现.这些操作符具有固定的符号表示(如 + 或 *) 和固定的优先级.为实现这样的操作符,我们为相应的类型(即二元操作符左侧的类型和一元操作符的 ...