vue项目基于D3js的3D饼图实现(二)

文章介绍了如何在Pie3D组件中通过配置项sfShowLabel来显示文本标签和引导线。使用d3.js库,对数据集dataset进行操作,创建线段表示引导线,并定位文本,以展示饼图各部分的标签信息,包括值和描述。
摘要由CSDN通过智能技术生成

一、文本标线的实现

效果图如下

注意这里在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})`
                })

        }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值