4圈饼图+会转动
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gZDAdvsI-1644975828825)(C:\Users\Q\AppData\Local\Temp\1642644053956.png)]
option = {
backgroundColor: '#142468',
title:{
text: '旋转饼图及配色'
},
series: [
{
type: 'pie',
zlevel: 1,
silent: true,
/*
radius
饼图的半径。可以为如下类型:
number:直接指定外半径值。
string:例如,'20%',表示外半径为可视区尺寸(容器高宽中较小一项)的 20% 长度。
Array.<number|string>:数组的第一项是内半径,第二项是外半径。每一项遵从上述 number string 的描述。
*/
radius: ['97%', '98%'],
hoverAnimation: false,
//color: "rgba(88,142,197,0.5)",
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [{
offset: 0, color: '#9933FF' // 0% 处的颜色
}, {
offset: 1, color: '#00CCFF' // 100% 处的颜色
}],
global: false // 缺省为 false
},
// animation:false, //charts3 no
label: {
normal: {
show: false
},
},
labelLine: {
normal: {
show: false
}
},
data: [1]
},
{
type: 'pie',
zlevel: 2,
silent: true,
radius: ['90%', '91%'],
startAngle: 90,
hoverAnimation: false,
// animation:false, //charts3 no
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [{
offset: 0, color: '#9933FF' // 0% 处的颜色
}, {
offset: 1, color: '#00CCFF' // 100% 处的颜色
}],
global: false // 缺省为 false
},
label: {
normal: {
show: false
},
},
labelLine: {
normal: {
show: false
}
},
data: _pie2()
},
{
type: 'pie',
zlevel: 3,
silent: true,
radius: ['83%', '84%'],
label: {
normal: {
show: false
},
},
labelLine: {
normal: {
show: false
}
},
data: _pie3()
},
{
type: 'pie',
zlevel: 4,
silent: true,
radius: ['78%', '80%'],
color: ["#fc8d89", "#46d3f3", "rgba(203,203,203,0.9)"],
startAngle: 50,
hoverAnimation: false,
// animation:false, //charts3 no
label: {
normal: {
show: false
},
},
data: [1,2,3]
}
]
};
function _pie1() {
let dataArr = [];
for (var i = 0; i < 8; i++) {
dataArr.push({
name: (i + 1).toString(),
value: 20,
itemStyle: {
normal: {
color: "rgba(88,142,197,0.4)",
borderWidth: 0,
borderColor: "rgba(0,0,0,0)"
}
}
})
}
return dataArr
}
function _pie2() {
let dataArr = [];
let _color = {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [{
offset: 0, color: '#9933FF' // 0% 处的颜色
}, {
offset: 1, color: '#00CCFF' // 100% 处的颜色
}],
global: false // 缺省为 false
}
for (var i = 0; i < 16; i++) {
if (i % 4 === 0) {
dataArr.push({
name: (i + 1).toString(),
value: 50,
itemStyle: {
normal: {
//color: "rgba(88,142,197,0.5)",
borderWidth: 0,
borderColor: "rgba(0,0,0,0)"
}
}
})
}else if (i % 4 === 1) {
dataArr.push({
name: (i + 1).toString(),
value: 2,
itemStyle: {
normal: {
color: "rgba(88,142,197,0)",
borderWidth: 0,
borderColor: "rgba(0,0,0,0)"
}
}
})
} else if (i % 4 === 2) {
dataArr.push({
name: (i + 1).toString(),
value: 20,
itemStyle: {
normal: {
//color: "rgba(88,142,197,0.2)",
borderWidth: 0,
borderColor: "rgba(0,0,0,0)"
}
}
})
} else {
dataArr.push({
name: (i + 1).toString(),
value: 2,
itemStyle: {
normal: {
//color: "rgba(0,0,0,0)",
color: "rgba(88,142,197,0)",
borderWidth: 0,
borderColor: "rgba(0,0,0,0)"
}
}
})
}
}
return dataArr
}
function _pie3() {
let dataArr = [];
for (var i = 0; i < 100; i++) {
if (i % 2 === 0) {
dataArr.push({
name: (i + 1).toString(),
value: 25,
itemStyle: {
normal: {
color: "rgb(126,190,255)",
borderWidth: 0,
borderColor: "rgba(0,0,0,0)"
}
}
})
} else {
dataArr.push({
name: (i + 1).toString(),
value: 20,
itemStyle: {
normal: {
color: "rgba(0,0,0,0)",
borderWidth: 0,
borderColor: "rgba(0,0,0,0)"
}
}
})
}
}
return dataArr
}
function _pieData(data) {
let _data = data;
let dataArr = [];
for (var i = 0; i < 5; i++) {
if (i === 2) {
let dt = (data[0].unit) ? 25 : (Number(data[0].value));
dataArr.push({
name: (i + 1).toString(),
value: dt,
itemStyle: {
normal: {
color: new echarts.graphic.LinearGradient(0, 1, 1, 0, [{
offset: 0,
color: 'rgb(147,187,216)'
}, {
offset: 1,
color: '#588ec5'
}]),
borderWidth: 0,
borderColor: "rgba(0,0,0,0.4)"
}
}
})
} else {
let dta = (data[0].unit) ? 25 : (1 - Number(data[0].value)) / 4;
dataArr.push({
name: (i + 1).toString(),
value: dta,
itemStyle: {
normal: {
color: "rgba(0,0,0,0)",
borderWidth: 0,
borderColor: "rgba(0,0,0,0)"
}
}
})
}
}
//console.log(dataArr)
return dataArr
}
//鼠标事件:'click','dblclick','mousedown','mouseup','mouseover','mouseout','globalout'。
myChart.on('mouseover', function(params) {
stopTimer();
});
myChart.on('mouseout', function(params) {
startTimer();
});
var timer;
function doing() {
let option = myChart.getOption();
option.series[1].startAngle = option.series[1].startAngle - 1;
//option.series[2].startAngle = option.series[2].startAngle - 1;
//option.series[6].data[0].value = option.series[6].data[0].value + 1;
myChart.setOption(option);
}
function startTimer() {
timer = setInterval(doing, 100);
}
function stopTimer() {
clearInterval(timer);
xzTimer = null;
}
setTimeout(startTimer, 500);
/*
window.onload = function() {
setTimeout(startRotate, 500);
}
*/
玫瑰图
option = {
backgroundColor: 'rgb(43, 51, 59)',
toolbox: {
show: true,
feature: {
mark: {
show: true
},
dataView: {
show: true,
readOnly: false
},
magicType: {
show: true,
type: ['pie', 'funnel']
},
restore: {
show: true
},
saveAsImage: {
show: true
}
}
},
calculable: true,
"tooltip": {
"trigger": "item",
"formatter": "{a}<br/>{b}:{c}千万元"
},
"title": {
"text": "南丁格尔玫瑰图--PieHalfRose",
"left": "center",
"top": 20,
"textStyle": {
"color": "#ccc"
}
},
"calculable": true,
"legend": {
"icon": "circle",
"x": "center",
"y": "15%",
"data": [
"义乌市1",
"义乌市2",
"义乌市3",
"义乌市4",
"义乌市5",
"义乌市6",
"义乌市7",
"义乌市8",
"义乌市9"
],
"textStyle": {
"color": "#fff"
}
},
"series": [{
"name": "XX线索",
"type": "pie",
"radius": [
37,
155
],
"avoidLabelOverlap": false,
"startAngle": 0,
"center": [
"50.1%",
"34%"
],
"roseType": "area",
"selectedMode": "single",
"label": {
"normal": {
"show": true,
"formatter": "{c}千万元"
},
"emphasis": {
"show": true
}
},
"labelLine": {
"normal": {
"show": true,
"smooth": false,
"length": 20,
"length2": 10
},
"emphasis": {
"show": true
}
},
"data": [{
"value": 600.58,
"name": "义乌市1",
"itemStyle": {
"normal": {
"color": "#f845f1"
}
}
},
{
"value": 1100.58,
"name": "义乌市2",
"itemStyle": {
"normal": {
"color": "#ad46f3"
}
}
},
{
"value": 1200.58,
"name": "义乌市3",
"itemStyle": {
"normal": {
"color": "#5045f6"
}
}
},
{
"value": 1300.58,
"name": "义乌市4",
"itemStyle": {
"normal": {
"color": "#4777f5"
}
}
},
{
"value": 1400.58,
"name": "义乌市5",
"itemStyle": {
"normal": {
"color": "#44aff0"
}
}
},
{
"value": 1500.58,
"name": "义乌市6",
"itemStyle": {
"normal": {
"color": "#45dbf7"
}
}
},
{
"value": 1500.58,
"name": "义乌市7",
"itemStyle": {
"normal": {
"color": "#f6d54a"
}
}
},
{
"value": 1600.58,
"name": "义乌市8",
"itemStyle": {
"normal": {
"color": "#f69846"
}
}
},
{
"value": 1800,
"name": "义乌市9",
"itemStyle": {
"normal": {
"color": "#ff4343"
}
}
},
{
"value": 0,
"name": "",
"itemStyle": {
"normal": {
"label": {
"show": false
},
"labelLine": {
"show": false
}
}
}
},
{
"value": 0,
"name": "",
"itemStyle": {
"normal": {
"label": {
"show": false
},
"labelLine": {
"show": false
}
}
}
},
{
"value": 0,
"name": "",
"itemStyle": {
"normal": {
"label": {
"show": false
},
"labelLine": {
"show": false
}
}
}
},
{
"value": 0,
"name": "",
"itemStyle": {
"normal": {
"label": {
"show": false
},
"labelLine": {
"show": false
}
}
}
},
{
"value": 0,
"name": "",
"itemStyle": {
"normal": {
"label": {
"show": false
},
"labelLine": {
"show": false
}
}
}
},
{
"value": 0,
"name": "",
"itemStyle": {
"normal": {
"label": {
"show": false
},
"labelLine": {
"show": false
}
}
}
},
{
"value": 0,
"name": "",
"itemStyle": {
"normal": {
"label": {
"show": false
},
"labelLine": {
"show": false
}
}
}
},
{
"value": 0,
"name": "",
"itemStyle": {
"normal": {
"label": {
"show": false
},
"labelLine": {
"show": false
}
}
}
},
{
"value": 0,
"name": "",
"itemStyle": {
"normal": {
"label": {
"show": false
},
"labelLine": {
"show": false
}
}
}
}
]
}]
};
男女饼图
// PS: 饼图非常吃数据,想要好看的饼图,必须有合格的数据支持
// mock 数据
const dataArray = [
{ name: '教师', num: 2000 },
{ name: '医生', num: 2000 },
{ name: '程序员', num: 2000 },
{ name: '公务员', num: 2000 },
{ name: '金融', num: 2000 },
{ name: '客服', num: 2000 },
{ name: '老板', num: 2000 },
{ name: '其他', num: 2000 },
]
const dataArr = [
{ name: '女', num: 50 },
{ name: '男', num: 50 }
]
// 计算总数
let total = dataArray.reduce((p,v) => { return p + v.num }, 0)
const colorList = [
[{ offset: 0, color: 'rgba(173, 255, 248, 1)'}, { offset: 1, color: 'rgba(50, 255, 238, 1)'}],
[{ offset: 0, color: 'rgba(177, 255, 237, 1)'}, { offset: 1, color: 'rgba(0, 233, 179, 1)'}],
[{ offset: 0, color: 'rgba(178, 255, 191, 1)'}, { offset: 1, color: 'rgba(29, 246, 66, 1)'}],
[{ offset: 0, color: 'rgba(248, 255, 163, 1)'}, { offset: 1, color: 'rgba(240, 255, 71, 1)'}],
[{ offset: 0, color: 'rgba(255, 234, 149, 1)'}, { offset: 1, color: 'rgba(255, 213, 47, 1)'}],
[{ offset: 0, color: 'rgba(255, 180, 145, 1)'}, { offset: 1, color: 'rgba(255, 126, 76, 1)'}],
[{ offset: 0, color: 'rgba(255, 156, 150, 1)'}, { offset: 1, color: 'rgba(255, 96, 86, 1)'}],
[{ offset: 0, color: 'rgba(178, 217, 255, 1)'}, { offset: 1, color: 'rgba(97, 187, 255, 1)'}],
]
const colorList2 = [
[{ offset: 0, color: '#68d3ff'}, { offset: 1, color: '#bfecff'}],
[{ offset: 0, color: '#ff938d'}, { offset: 1, color: '#ffdfdd'}],
]
const color = [ 'rgba(50, 255, 238, 1)', 'rgba(0, 233, 179, 1)', 'rgba(29, 246, 66, 1)', 'rgba(240, 255, 71, 1)', 'rgba(255, 213, 47, 1)', 'rgba(255, 126, 76, 1)', 'rgba(255, 96, 86, 1)', 'rgba(97, 187, 255, 1)', ]
const color2 = ['#00a7ec', '#ff564c']
// data数据
const echartData = dataArray.map((v, i) => ({
name: v.name,
value: v.num,
itemStyle: {
color: { type: 'linear', colorStops: colorList[i] }
},
label: {
color: color[i]
}
}))
const totalData = dataArr.map((v, i) => ({
name: v.name,
value: v.num,
itemStyle: { color: { type: 'linear', colorStops: colorList2[i] } },
label: { color: color2[i] }
}))
// tooltip
const tooltip = {
trigger: 'item',
formatter: params => {
return `
<div>${params.data.name}: ${params.data.value}</div>
`
}
}
// series
const series = [{
name: '性别比例',
type: 'pie',
center: ['50%', '50%'],
radius: [0, '45%'],
label: {
fontSize: 16,
position: 'inner',
formatter: params => {
return `{${params.name === '男'? 'a': 'b'}|}\n\n${params.percent.toFixed(0)}%`
},
rich: {
a: {
width: 24,
height: 34,
backgroundColor: { image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAARCAYAAAGeOn00AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA+hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQwIDc5LjE2MDQ1MSwgMjAxNy8wNS8wNi0wMTowODoyMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgKE1hY2ludG9zaCkiIHhtcDpDcmVhdGVEYXRlPSIyMDIxLTAxLTI2VDE0OjAxOjA3KzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyMS0wMS0yNlQwNjowMTowNyswODowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyMS0wMS0yNlQwNjowMTowNyswODowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MzkzNDUzODc1N0MwMTFFQjg4MUFBREMzRTE4MjA1QkYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MzkzNDUzODg1N0MwMTFFQjg4MUFBREMzRTE4MjA1QkYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDozOTM0NTM4NTU3QzAxMUVCODgxQUFEQzNFMTgyMDVCRiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDozOTM0NTM4NjU3QzAxMUVCODgxQUFEQzNFMTgyMDVCRiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pqz3FB4AAAFASURBVHjaYvwf5sMAAkxA7A7EvCxAYidIBCCAGIBSniDhOSBCGiCAGGEqQYAFSv8HEQABBJN5BsRSTFAZKZihN6DK/oM4v6CyjCCOHhAfBfEAAgjZaJAhkiAxZGteArEYkpUiIO3zgVifAQE+AXE6SEciVMAXiDcDMT+IAxBA6HYkA/F2mBthAGTxPHQ/MsBcAwMgHcIwX0HxS5jEGyDmQ7LnPRB7gIyqBuInSIEDsqsd5qr/SMaDAkyTCc1iP5AgunOPQD0IBgABhhI/aIEJAs9hkYLsDXSQAsQvgPgplM2AS4M3EH8A4q1ALAFKHlA2SMwHXcMiIN4CxHOB+CaSITehYpuhasAa7gFxDBDbQd2vjqRBHSpmC1VzGxSwSlBJkElJWPzUA5VjQvdDMjR8G5DEGqFiKfhCaRYSeya6JACa+kVE7jeZ3AAAAABJRU5ErkJggg=="},
},
b: {
width: 24,
height: 34,
backgroundColor: { image: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAARCAYAAAGTJA1zAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA+hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQwIDc5LjE2MDQ1MSwgMjAxNy8wNS8wNi0wMTowODoyMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgKE1hY2ludG9zaCkiIHhtcDpDcmVhdGVEYXRlPSIyMDIxLTAxLTI2VDE0OjAxOjA3KzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyMS0wMS0yNlQwNjowMTowNyswODowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyMS0wMS0yNlQwNjowMTowNyswODowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MzkzNDUzODM1N0MwMTFFQjg4MUFBREMzRTE4MjA1QkYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MzkzNDUzODQ1N0MwMTFFQjg4MUFBREMzRTE4MjA1QkYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDozOTM0NTM4MTU3QzAxMUVCODgxQUFEQzNFMTgyMDVCRiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDozOTM0NTM4MjU3QzAxMUVCODgxQUFEQzNFMTgyMDVCRiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PkPD8hsAAAEYSURBVHjaYmRY/oYBBJiAOBaI/4MYi4GYESCAGIBSz0A8SRAhDBBAjDCVMNUgsAREAAQQTMYTJrodxGgBGQaT+g+TYgAIIGRj/gPxC5gFMAEQkADiDSDBdxCHgGkQMAIJCkE5eVBaDiCA4A4A4rlALIXsRJCAJMxGFigtxYAEQCp3QW2HYbA7/yMpagXiyyDtj4FYFuqkGiB+C9IuB/M5lBZmQtK6HT3UUAQBAgwlXIHgGZJ7nyM7FVk3CKRAQ+8plI0ROXZQ07ZCQ1Qayr4HxJYwhQJAvAeIPzBggh9AvA+IeZmg4cgKTSToACTGAcTzQJ5xAjK+APEpaFDCaHNoXJoBMQ8L1GgGtCCBKWSAasTwNUzhdnRBADYqQ0hfEuEBAAAAAElFTkSuQmCC' }
}
}
},
selectedMode: 'single',
data: totalData,
},{
name: '从业人员统计',
type: 'pie',
radius: ['50%', '70%'],
center: ['50%', '50%'],
avoidLabelOverlap: false,
label: {
show: true,
fontSize: 16,
formatter: params => {
let percent = (params.data.value / total) * 100
return `${percent.toFixed(1)}%`
}
},
labelLine: { show: true},
data: echartData,
emphasis:{
labelLine: { itemStyle: { shadowColor: 'rgba(250,250,250,0.2)', shadowBlur: 20 }},
label: {
fontSize: 24,
formatter: params => {
let percent = (params.data.value / total) * 100
return `${percent.toFixed(1)}%\n{a|${params.data.name}}`
},
rich: {
a: {
fontSize: 12,
align:'center'
}
}
}
}
}]
// 渲染
option = { tooltip, series, color, backgroundColor: 'rgba(0, 0, 0, .8)' }
demo来源echarts、Makepie社区