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 ...
随机推荐
- Google reCAPTCHA
Spam from Website Enquiry 网站一般上都会有 Contact Us 页面. 里头有一个表格, 访客可以通过提交表格发出对产品和服务的讯问. 本来是一个质询功能, 但就是有坏人利 ...
- vivo 全链路多版本开发测试环境落地实践
作者:来自 vivo 互联网研发效能团队- Wang Kang 测试环境全链路多版本部署,解决多测试环境资源争抢等问题. 一.背景介绍 软件系统中全链路指的是从用户请求发起,到最终返回响应的整个过程中 ...
- 贝壳找房携手 Flutter,为三亿家庭提供更好的居住服务 | Flutter 开发者故事
贝壳找房是科技驱动的新居住服务平台,致力于在二手房.新房.租房以及装修等居住领域为三亿家庭提供全方位的品质居住服务.如此庞大的用户群体,自然也有着十分多样和复杂的使用场景和需求.以往使用原生开发模式时 ...
- Windows安装winget
打开GitHub链接地址:https://github.com/microsoft/winget-cli/releases 选择最新版本,点进去后 找到名为后缀名为 ".msixbundle ...
- 图片 电力电网行业IT运维方案
智能电网背景下,电力.电网企业信息化逐渐渗透到其业务链的各个环节,云计算.物联网.移动互联网等新技术的应用,更驱动信息化与业务创新深度融合.电力.电网企业集团信息系统群逐渐朝着一体化方向发展,信息链越 ...
- 使用Redis的好处
性能极高--redis能支持超过100K+每秒的读写频率 丰富的数据类型--Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型 ...
- rancher发布nacos server docker 失败
使用rancher发布nacos server 时报错 进入镜像查看日志发现报错No DataSource set 检查了好几遍环境变量已经全都配了,最后发现在nohup.out文件中指出没有找到na ...
- 使用 KubeSphere 应用商店 5 分钟内快速部署 JuiceFS
作者:朱唯唯,尹珉 JuiceFS 简介 JuiceFS 是为海量数据设计的分布式文件系统,使用对象存储来做数据持久化,避免重复造轮子,还能大大降低工程复杂度,让用户专注解决元数据和访问协议部分的难题 ...
- Linux_进程理解、状态与优先级(详细版)
1.进程的概念 课本概念:程序的一个执行实例,正在执行的程序等. 内核观点:担当分配系统资源(CPU时间,内存)的实体. 其实:进程=内核的相关管理数据结构(task_struct.页表等)+程序的代 ...
- Java受保护的访问修饰符protected
声明:我不去上来给大家那一张被扯来扯去的√,×表,什么表想必大家心里清楚 下面进入正题: protected 的主要着眼点在于两点: 1.子类继承 2.是否同包 心里记着上面的那两点,那么protec ...