一、文本标线的实现
效果图如下
注意这里在Pie3D.vue文件中加了一个sfShowLabel的配置项
在pie.js中添加如下代码
//是否显示标签
if(config.sfShowLabel){
//创建文本标签引导线
const line = d3.select('#pie_chart')
.append('g')
.attr('transform',`translate(350,200)`)
.attr('class','line');
//引导线
line.selectAll('.line')
.data(dataset)
.enter()
.append('line')
.attr('stroke',(d,index) => {
let colorIndex = index % config.color.length
return config.color[colorIndex]
})
.attr('x1',0)
.attr('y1',0)
.attr('x2',d => {
return 1.5 * rx * Math.cos(0.5 * (d.startAngle + d.endAngle))
})
.attr('y2',d => {
return 1.5 * ry * Math.sin(0.5 * (d.startAngle + d.endAngle))
})
.style('visibility', d => {
return 'visible'
});
//文本
const textbox = d3.select('#pie_chart')
.append('g')
.attr('transform','translate(350,200)')
.attr('class','textbox');
const text = textbox.selectAll('desc')
.data(dataset)
.enter()
.append('text')
.attr('font-size','14px')
.attr('text-anchor','middle')
.style('visibility', d => {
return 'visible'
})
.attr('fill',(d,index) => {
let colorIndex = index % config.color.length
return config.color[colorIndex]
})
.text(d => {
return `${d.data.label}:${d.data.value}${d.data.DWMC}`
})
.attr('transform', d => {
let x = 1.5 * (rx + 10) * Math.cos(0.5 * (d.startAngle + d.endAngle))
let y = 1.5 * (ry + 10) * Math.sin(0.5 * (d.startAngle + d.endAngle))
return `translate(${x},${y})`
})
}