配置项如下
let imgSrc = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAMAAABHPGVmAAAAllBMVEUAAAAY258A1JYY258X2p4l2Zkd3qMY258Y3KAY258Y258X3J8V2p0Y2Z8Y26AW3Z0Y258Y2p4X258Y258X258Y258Y258Y3J8Y3J8Y258T2Z0Y258Y3J8Z26AY26AY258Y258X258X3J8Y3KAX3J8X3J8a36UY3J8Y26AX258X258Y258Y258Y258Y26AX3J8Y3J8Y258TXRF7AAAAMXRSTlMA3QSHmQYR62bM1iwiH0oWdxuv9OW1kTs0qA372SfSx1XvbU9BoQm8lVqMf1/3wplypN/JAQAAA+pJREFUaN7t2dl6ojAYBuAPFNxFcANRUXGry7S5/5ub+UNtaIk1iXAwT/ueeNDAR1ZCih/L3yWnGarltBljAaoVMlJxVfqM9JD3G/Ib8jND7E10nt0JGa6vd0L8SfQCda+MsbYnjbdpbbEh0Wkwxt6gasbI3IeOxYgusqBqH+unUAZdA2V1RqjFVFFbkQ2UOQHTqwvVg7xCgzOW1aXTnIxbljVvBbVLT1aPCWCU8jGSt7sGy7OOnY96GGWIFqshMx2zovH0vWwk2sqgLmdwYYvJjbNWsyNRD+2UI8i+FrPM+jBprlYvm3oyZJnhxuYpB8owSjnzG/SW7wnHMDfzt9H1vTK819wBnhFmo3N02UPI7rtmZOnjWVPeMNeabL30dll+F8/pNvhtQsj1eWXaLp7hzekmiXd/qvMCfxw84UC3OHx3C8+iIieY2/COdRUadGveWNTiDf/R8IupW2wYOrJ/Hr9Ra1SsCTP+leaa4k7fMux7esJYZQ6k7J8VTNgj1U8Re05j0Gyuq4+aDdXZNW0tC0pmMR8hBhLGWF2j7KtJl1zp6TRq3YKCXjS3blygq7Pp7dP7iyamddM+zmRPvmSCDWyzXzUdKuzRrxBJywlrACtaUpTnLV21AHpMiG1ZOYEG1UVn0+nQVSHtogXpEx6LIW3lUcJDKExoynuvdjN4b66R1ndAF3BqN+ep8oDR6hMP2jo65xvTwlDUaIEp1Fx4RxoYabyKJqZnRwGfUGqWfN9s4I1mpQMVXZO9hLgyhYoBzT0bJlq0bYOCPXXfDkaaqo2wEQNRm0MPuHzcCl5DVNms69kAj0RUrP/U0Wk8VWnVAMamfMlefF8mpkWuB3M1vvD73y1xa7GXNWQfHuzre/xj74inuNlHzv7bj6TAhqlOKB41gNQ+oT8m/BFSzySjYbnZ7/2BHIkvxsWw7RlkUDN8fP/GHRSlYljsl3Tao50hTlb68Z1Fv02Dlw9wOxBnSloZYkE60c0c+Qv6IiYkpRhkTHLbhGJ7rcQC74z1U5Yig6MJ15cubQkgUrQWfFdkiNCm9MUe4XPKSH2eN0QGx4++pJuAE3Ipeiv+6kojS9iJzJzDbf6I87tGCHV+ukDOq/RDKvl6RBv2XZibFLpU9FRpzrKDDZdWgrTkf2gcNs28Nz7OfZTGtphcgBJtYybT6KFM/QYrandQrtkmSFp5f3YvNv5P6ameV5uifDX21QvKZg8LIa3/MwSnQsgF5Vsd63mnLaqwd/McVGCRsE/iwEXpWuyrHcrmsII5StcuhEQoXWixzxIfFfC7eR6qMR0IC1Rky27oS7QqqXVbtkJUxw7T1WqVLvBT/QXZze13haQUPgAAAABJRU5ErkJggg==';
let chartData = [
{
value: 520,
name: '幼儿园',
},
{
value: 280,
name: '小学',
},
{
value: 100,
name: '初中',
},
{
value: 100,
name: '高中',
},
];
let colorList = ['#115FEA', '#10EBE3', '#10A9EB', '#EB9C10', '#2E10EB', '#9B10EB'];
let sum = chartData.reduce((per, cur) => per + cur.value, 0);
let gap = 1 * sum / 100;
let pieData1 = [];
let pieData2 = [];
let gapData = {
name: '',
value: gap,
itemStyle: {
color: 'transparent',
},
};
for (let i = 0; i < chartData.length; i++) {
// 第一圈数据
pieData1.push({
...chartData[i],
itemStyle: {
borderRadius: 10
}
});
pieData1.push(gapData);
// 第二圈数据
pieData2.push({
...chartData[i],
itemStyle: {
color: colorList[i],
opacity: 0.1,
},
});
pieData2.push(gapData);
}
console.log(pieData2);
option = {
backgroundColor: '#000',
tooltip: {
show: false,
backgroundColor: 'rgba(17,95,234,0.5)',
textStyle: {
color: '#F0F0F0',
},
},
legend: {
show: true,
right: 'right',
top: 'center',
icon: 'rect',
itemWidth: 4,
itemHeight: 20,
textStyle: {
color: '#F0F0F0',
rich: {
name: {
padding: [0, 10, 0, 8],
color: '#fff',
fontSize: 16,
},
percent: {
padding: [0, 0, 0, 8],
color: '#fff',
},
},
},
formatter: (name) => {
console.log(name);
console.log(chartData);
let item = chartData.find((i) => {
return i.name == name;
});
let p = ((item.value / sum) * 100).toFixed(0);
return '{name|' + name + '}' + '{percent|' + p + '}' + '%';
},
},
graphic: {
elements: [{
type: "image",
z: 3,
style: {
image: imgSrc,
width: 70,
height: 70,
},
top: 'middle',
left: 'center',
scale: [1.5,1.5]
}]
},
grid: {
top: 35,
right: 30,
bottom: 20,
left: 30,
},
color: colorList,
series: [
{
name: '消息来源',
type: 'pie',
roundCap: true,
radius: ['76%', '80%'],
center: ['50%', '50%'],
label: {
show: false,
},
labelLine: {
show: false,
},
data: pieData1,
},
{
type: 'pie',
radius: ['76%', '64%'],
center: ['50%', '50%'],
gap: 1.71,
label: {
show: false,
},
labelLine: {
show: false,
},
silent: true,
data: pieData2,
},
{
type: 'pie',
center: ['50%', '50%'],
radius: [0, '45.6%'],
label: {
show: false,
},
labelLine: {
show: false,
},
itemStyle: {
color: 'rgba(5,37,95,0.3)',
},
silent: true,
data: [
{
value: 100,
name: '',
},
],
},
],
};