Toggle navigation
内向(外向)渐变
By
我***爱
2018-12-10 14:06:19
脚本
16
21
作品使用的第三方脚本
数据管理
上传数据
支持小于 5M 任意格式(csv, xlsx, json, xml, ...)的数据文件
上传后可以通过生成的文件链接异步获取托管的数据。
历史数据
0 条
无历史数据
代码修改记录
信息提示
保存作品
对当前截图不满意?你还可以
上传本地截图
重新截图
作品名称
作品描述
标签
geo
grid
legend
markLine
markPoint
bar
effectScatter
line
lines
map
timeline
title
toolbox
tooltip
visualMap
作品默认版本
最新
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
20:11:45
图表已生成
整理代码
刷新
代码
// Echarts的Pie图的径向渐变不是很方便, 如果有人需要指向圆心的径向渐变可以直接用 // 需要注意的是: // 1.legend会变得很奇怪, 最好自己重写 // 2.legend在点击之后(少了一个弧之后)也会不对, 最后在点击之后重新用calc来计算 // (或者)干脆别让他点... var data = [ {value:20, name:'直接访问', color0: '#F45D67', color1: '#E2332B'}, {value:20, name:'邮件营销', color0: '#F0C35E', color1: '#D45900'}, {value:20, name:'联盟广告', color0: '#15E09B', color1: '#1DBD6B'}, {value:20, name:'视频广告', color0: '#0E58D4', color1: '#093ED9'}, {value:20, name:'搜索引擎', color0: 'yellow', color1: 'green'} ] // 计算总数 var total = data.map(v => v.value).reduce((o, n) => o + n ); // 计算每一个data的其实角度和末了角度 θ1和θ2 data.reduce((o, v) => { v.theta1 = o; v.theta2 = o + v.value / total; return v.theta2 }, 0); // 添加渐变 data.forEach((v, i) => { var ops = calc(v.theta1 * 2 * Math.PI, v.theta2 * 2 * Math.PI); if (v.value) v.itemStyle = { color: { type: 'radial', x: ops.center[0], y: ops.center[1], r: ops.radius, colorStops: [{ offset: 0, color: v.color0 },{ offset: 0.5, color: v.color0 },{ offset: 0.3, color: v.color1 }, { offset: 1, color: v.color1 }], globalCoord: false // 缺省为 false } } }) // 计算渐变中心以及渐变半径 function calc (theta1, theta2) { var r = 0.5; // 半径是0.5 其实表示0.5个直径 var inner = 0.6; // 里面镂空部分占60% option中radius为[33%, 55%] 55 * 0.6 == 33 var cos = Math.cos; var sin = Math.sin; var PI = Math.PI; var min = Math.min; var max = Math.max; var bottom = 0; var left = 2 * r; var right = 0; // y0: θ1对应的外部点的y值 // y1: θ2对应的外部点的y值 // _y0: θ1对应的内部点的y值 // _y1: θ2对应的内部点的y值 // x0: θ1对应的外部点的x值 // x1: θ2对应的外部点的x值 // _x0: θ1对应的内部点的x值 // _x1: θ2对应的内部点的x值 var y0 = r * (1 - cos(theta1)); var y1 = r * (1 - cos(theta2)); var _y0 = r * (1 - inner * cos(theta1)); var _y1 = r * (1 - inner * cos(theta2)); // 如果这个弧经过θ == PI的点 则bottom = 2PI // bottom用于之后的max计算中 if (theta1 < PI && theta2 > PI) { bottom = 2 * r; } // 计算这几个点的最大最小值 var ymin = min(_y0, _y1, y0, y1); var ymax = max(_y0, _y1, y0, y1, bottom); var x0 = r * (1 + sin(theta1)); var x1 = r * (1 + sin(theta2)); var _x0 = r * (1 + inner * sin(theta1)); var _x1 = r * (1 + inner * sin(theta2)); // 如果这个弧经过θ == PI / 2的点 则right = 2PI if (theta1 < PI / 2 && theta2 > PI / 2) { right = 2 * r; } // 如果这个弧经过θ == PI / 2 * 3的点 则left = 0 if (theta1 < PI / 2 * 3 && theta2 > PI / 2 * 3) { left = 0; } xmin = min(_x0, _x1, x0, x1, left); xmax = max(_x0, _x1, x1, x0, right); return { // 计算圆心以及半径 center: [(r - xmin) / (xmax - xmin), (r - ymin) / (ymax - ymin)], radius: r / min(xmax - xmin, ymax - ymin) } } option = { title : { text: '内向渐变', x:'center' }, tooltip : { trigger: 'item', formatter: "{a}
{b} : {c} ({d}%)" }, legend: { orient: 'vertical', left: 'left', data: ['直接访问','邮件营销','联盟广告','视频广告','搜索引擎'] }, series : [ { name: '访问来源', type: 'pie', radius : ['33%', '55%'], center: ['50%', '60%'], data:data, itemStyle: { emphasis: { shadowBlur: 10, shadowOffsetX: 0, shadowColor: 'rgba(0, 0, 0, 0.5)' } }, // animation: false } ] };