You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

137 lines
2.5 KiB
JavaScript

1 year ago
/**
* 环形图
* 作者tmzdy
* url:https://jx2d.cn
*/
let ring = function (render, config={}) {
let defauletcfg = {
tooltip: {
trigger: 'item'
},
color:["#E91E63","#2196F3","#311B92","#FDD835","#BCAAA4"],
legend: {
top: '5%',
left: 'center'
},
series: [{
name: 'Access From',
type: 'pie',
radius: ['20%', '35%'],
label: {
show: false,
position: 'center'
},
emphasis: {
label: {
show: true,
fontSize: '40',
fontWeight: 'bold'
}
},
labelLine: {
show: false
},
data: [{
value: 1048,
name: 'Search Engine'
},
{
value: 735,
name: 'Direct'
},
{
value: 580,
name: 'Email'
},
{
value: 484,
name: 'Union Ads'
},
{
value: 300,
name: 'Video Ads'
}
]
}]
}
defauletcfg = {...defauletcfg,...config}
const [w, h] = render.area;
//最大圆环厚度。等于圆。
let lineMaxHeight = w / 2;
let lineStoreWidth = (parseFloat(defauletcfg.series[0].radius[1]) - parseFloat(defauletcfg.series[0].radius[0]))/100;
lineStoreWidth =Math.floor( lineStoreWidth*lineMaxHeight);
let r = parseFloat(defauletcfg.series[0].radius[1])/100 * lineMaxHeight;
let data = defauletcfg.series[0].data;
let maxValue = data.map(el => parseInt(el.value));
//总数量。
maxValue = maxValue.reduce((p,c)=>p+c);
//计算各自的比例数量。保留两位小数点。
let rang = Math.PI *2;
//每一个元素的圆弧的长度。
let rangArray = data.map(el=>{
let num = parseInt(el.value)/maxValue;
return rang*num
})
let dataBlv = data.map((el,index) => {
let st = index;
let num = parseFloat(el.value)/maxValue;
let blv = parseFloat(num.toFixed(2));
let startAngle = 0;
let endAngle = 0;
if(st==0){
startAngle = 0;
endAngle = rangArray[st]
}else{
let s = rangArray.slice(0,st)
startAngle = s.reduce((p,c)=>p+c);
endAngle = startAngle+rangArray[st]
}
return {...el,
blv:blv,
startAngle:startAngle,
endAngle:endAngle
};
});
let xf = [];
dataBlv.forEach((el,index)=>{
let cfg = {
name: 'arc',
animationCurve: 'liner',
hover: false,
drag: false,
shape: {
rx: w/2,
ry: h/2,
r: r,
startAngle: el.startAngle,
endAngle: el.endAngle,
},
style: {
stroke: defauletcfg.color[index],
lineWidth: lineStoreWidth,
shadowBlur: 0,
rotate: 0,
shadowColor: '#66eece',
hoverCursor: 'pointer',
},
};
xf.push(cfg)
})
return xf;
}
export default ring;