3D饼图
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饼图的更多相关文章
- Flex中的FusionCharts 3D饼图
1.3D饼图设计源码 <?xml version="1.0" encoding="utf-8"?> <s:Application xmlns: ...
- fusioncharts的3D饼图固定大小和角度
3D饼图的pieRadius和startingAngle属性 pieRadius:饼图的半径 startingAngle:饼图的角度(旋转) 在固定大小的div里面,饼图上如果显示label或者val ...
- Highcharts 3D柱形图;Highcharts 堆叠3D柱形图;Highcharts 3D饼图;Highcharts 3D圆环图
Highcharts 3D柱形图 配置 chart.options3d 配置 以下列出了 3D 图的基本配置,设置 chart 的 type 属性为 column,options3d 选项可设置三维效 ...
- 读取数据库数据,并将数据整合成3D饼图在jsp中显示
首先我将生成饼图的方法独立写成一个PieChar.java类,详细代码如下:(数据库需要自己建,如有需要的话) import java.io.IOException; import java.sql. ...
- FusionCharts参数说明-----3D饼图属性(Pie3D.swf )
animation 是否显示加载图表时的动画 palette 内置的图表样式,共5个 paletteColors 自定义图表元素颜色(为多个,如过过少会重复) showAboutMenuItem 右键 ...
- FusionCharts参数说明——3D饼图属性(Pie3D.swf )
animation 是否显示加载图表时的动画palette 内置的图表样式,共5个paletteColors 自定义图表元素颜色(为多个,如过过少会重复)showAboutMenuItem 右键是否显 ...
- JFreeChart 使用一 饼图之高级特性
原文链接:http://www.cnblogs.com/jtmjx/archive/2013/04/23/jfreechart_advantage.html 本文主要讲解JFreeChart中饼图的一 ...
- struts2整合JFreechart 饼图、折线图、柱形图
struts2整合JFreechart 饼图.折线图.柱形图 上效果图: 当然可以将数据导出图片格式存储.具体下的链接里的文件有保存成图片的操作. 因为是strust2整合JFreechart,所以s ...
- FusionCharts多数据验证饼图label是否重叠
昨天,有人问我一个问题:由于饼图的数据太多,label标签上的汉字过多,导致重叠,该怎么解决? 今天我用大量的数据,label标签的字符也很多,但是通过验证没有发现有重叠的情况啊! 1.验证的JSP页 ...
- c# Aspose.Words插入饼图PieChart
private static void Main(string[] args) { Document doc = new Document(); DocumentBuilder builder = n ...
随机推荐
- Angular 18+ 高级教程 – Angular Compiler (AKA ngc) Quick View
前言 在 Get Started 那一篇,我们提到过 Angular Compilation.这篇稍微给点具体画面,让大家感受一下. 但不会讲细节,对细节感兴趣的可以看这篇 Medium – How ...
- HTML – Native Form 原生表单功能集
前言 以前写过 form 表单, 但很不齐全, 这篇想做一个大整理. 主要讲讲在网站中使用原生 Form 的功能, 不足和扩展. 前端是原生的 HTML/JS, 后端是 ASP.NET Core Ra ...
- 游览器 reflow
refer: https://juejin.im/post/5a9372895188257a6b06132e reflow 伤性能. 所以要闪. 有几个频密触发的东西要留意. 1. scroll 2. ...
- linux操作系统和文件系统,命令(上)
Linux是一个类似于windows的操作系统 Linux操作系统的一种主要使用方式是通过终端软件:终端软件里只能使用键盘不能使用鼠标,在终端软件里通过输入命令完成各种任务 clear命令可以删除终端 ...
- Java实用小工具系列1---使用StringUtils分割字符串
经常有这种情况,需要将逗号分割的字符串,比如:aaa, bbb ,ccc,但往往是人工输入的,难免会有多空格逗号情况,比如:aaa, bbb , ccc, ,,这种情况使用split会解析出不正常的结 ...
- Guava中的Joiner和Splitter
目录 Guava 介绍 Joiner list转string map转string 处理嵌套集合 处理null值 Splitter string转list string转map 多个拆分符 输出 代码 ...
- kotlin协程——>select 表达式(实验性的)
select 表达式(实验性的) select 表达式可以同时等待多个挂起函数,并 选择 第⼀个可⽤的. 在通道中 select 我们现在有两个字符串⽣产者:fizz 和 buzz .其中 fizz ...
- day13-JavaDoc
JavaDoc JavaDoc命令是用来生成自己API文档的 参数信息 @author 作者名 @version 版本号 @since 指明需要最早使用的jdk版本 @param 参数名 @retur ...
- KubeSphere 在互联网医疗行业的应用实践
作者:宇轩辞白,运维研发工程师,目前专注于云原生.Kubernetes.容器.Linux.运维自动化等领域. 前言 2020 年我国互联网医疗企业迎来了"爆发元年",越来越多居民在 ...
- KubeSphere v4 安装指南
日前,KubeSphere v4 发布,相较于之前的版本,新版本在架构上有了颠覆性的变化.为了让社区的各位小伙伴能够丝滑的从旧版本过渡到新版本,我们特别推出本篇安装指南文章,以供参考. 关于 Kube ...