配置项如下
let title = '售票数量';
let color = ['rgb(54,142,243)', 'rgb(2,217,217)', 'rgb(255,237,91)', 'rgb(255,158,91)', 'rgb(84,95,255)'];
let angle = 0; //角度,用来做简单的动画效果的
let value = [];
let data1 =[
{value:400,name:'单程票'},
{value:389,name:'一日票'},
{value:489,name:'三日票'},
{value:259,name:'预附值票'},
{value:499,name:'纪念票'},
]
//获取圆上面某点的坐标(x0,y0表示坐标,r半径,angle角度)
function getCirlPoint(x0, y0, r, angle) {
let x1 = x0 + r * Math.cos((angle * Math.PI) / 180);
let y1 = y0 + r * Math.sin((angle * Math.PI) / 180);
return {
x: x1,
y: y1,
};
}
let formatNumber = function (num) {
let reg = /(?=(\B)(\d{3})+$)/g;
return num.toString().replace(reg, ',');
};
let total = data1.reduce((a, b) => {
return a + b.value * 1;
}, 0);
option = {
backgroundColor: 'rgb(0,34,69)',
color: color,
tooltip: {
trigger: 'item',
},
title: [
{
text: '{name|' + title + '}\n{val|' + formatNumber(total) + '}{c|件}',
top: 'center',
left: '27%',
textStyle: {
rich: {
name: {
fontSize: 20,
fontWeight: 'normal',
color: 'rgb(132,159,186)',
padding: [10, 0, 0, 20],
},
val: {
fontSize: 32,
fontWeight: 'bold',
color: 'rgb(61,153,252)',
padding:[0,10,0,15]
},
c: {
fontSize: 15,
fontWeight: 'normal',
color: 'rgb(132,159,186)',
},
},
},
},
],
legend: {
orient: 'vertical',
icon: 'rect',
x: '70%',
y: 'center',
itemWidth: 15,
itemHeight: 15,
itemGap: 10,
align: 'left',
textStyle: {
color: 'rgb(132,159,186)',
fontSize: 15,
padding: [0, 0, 0, 10],
},
formatter(name) {
let then = option.series[0].data; //获取series中的data
let total = 0;
for (let i = 0; i < then.length; i++) {
if (then[i].name != '' && then[i].name != null && then[i].name != undefined) {
total += parseInt(then[i].value);
}
}
var str = '';
var p = 0;
for (let i = 0; i < then.length; i++) {
if (then[i].name == name) {
p = (then[i].value / total) * 100;
str = name + ' ' + p.toFixed(2) + '%';
}
}
return str;
},
},
series: [
{
type: 'pie',
radius: ['45%', '60%'],
center: ['35%', '50%'],
data: data1,
hoverAnimation: false,
itemStyle: {
normal: {
borderColor: 'rgb(0,34,69)',
borderWidth: 3,
},
},
labelLine: {
normal: {
show: false,
length: 20,
length2: 120,
lineStyle: {
color: '#e6e6e6',
},
},
},
label: {
normal: {
show: false,
formatter: (params) => {
return '{icon|●}{name|' + params.name + '}{value|' + formatNumber(params.value) + '}';
},
padding: [0, -100, 25, -100],
rich: {
icon: {
fontSize: 16,
},
name: {
fontSize: 14,
padding: [0, 10, 0, 4],
color: '#666666',
},
value: {
fontSize: 18,
fontWeight: 'bold',
color: '#333333',
},
},
},
},
},
{
name: '', //外圆环
tooltip: {
show: false,
},
type: 'pie',
radius: ['68%', '67%'],
center: ['35%', '50%'],
hoverAnimation: false,
itemStyle: {
normal: {
label: {
show: false,
color: 'white',
},
},
},
data: [
{
value: 50,
name: '',
itemStyle: {
normal: {
color: ' #274C80',
opacity: 0.5,
},
},
},
],
},
{
name: '', //下方绿点
type: 'custom',
coordinateSystem: 'none',
renderItem: function (params, api) {
let x0 = (31 * api.getWidth()) / 90;
let y0 = api.getHeight() / 2.97;
let r = Math.min(api.getWidth(), api.getHeight()) / 2;
let point = getCirlPoint(x0, y0, r, 90 + -angle);
return {
type: 'circle',
shape: {
cx: point.x,
cy: point.y,
r: 3,
},
style: {
stroke: '#274C80', //粉
fill: '#274C80',
},
silent: true,
};
},
data: [0],
},
{
name: '', //上方绿点
type: 'custom',
coordinateSystem: 'none',
renderItem: function (params, api) {
let x0 = (31 * api.getWidth()) / 88;
let y0 = api.getHeight() / 1.51;
let r = Math.min(api.getWidth(), api.getHeight()) / 2;
let point = getCirlPoint(x0, y0, r, 270 + -angle);
return {
type: 'circle',
shape: {
cx: point.x,
cy: point.y,
r: 3,
},
style: {
stroke: '#274C80', //绿
fill: '#274C80',
},
silent: true,
};
},
data: [0],
},
],
}