【eCharts】echarts饼状图数据重叠导致指示线及显示文字重叠解决

本文介绍了一种在ECharts中实现饼图标签自动换行的方法,通过判断标签长度并进行切分,解决了标签过长导致的显示问题。核心代码在label的formatter函数中实现,根据不同长度的标签进行相应的换行处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载自:https://www.cnblogs.com/minjh/p/9081893.html   先看他的,再看我的,不看我的也行

1. 解决前

 

2.解决后

3.代码

function makePie(id, title, name, data, show) {
    if (!show) {
        show = false;
    }
    var myChart = echarts.init(document.getElementById(id));
    var option = {
        title: {
			show:false,
            text: title,
            top: 2,
            left: '20',
			textStyle: {fontSize: 14,color:'#767676',fontWeight:600,fontFamily:'Microsoft Yahei'},
			
        },
        tooltip: {
            trigger: 'item',
			textStyle: {fontSize: 12,fontFamily:'Microsoft Yahei'},
            formatter: function (params) {
                return params.data.name + ":<br/>" + fmoneyf(params.data.value, 0) + "(" + params.percent + "%)";
            }
        },
        legend: {
            // type: 'scroll',
			orient:'vertical',
			top:80,
			y:'middle',
			height:'60%',
            right: getValueFromJson(data, 'name').length > 6 ? 0 : 5,
		    textStyle: {fontSize: 12,color:'#848484'},
			icon:'circle',
            data: getValueFromJson(data, 'name')
        },
        series: [
            {
                name: name,
                x: 'left',  
                y: 'center', 
                type: 'pie',
				center:['50%', '60%'],
                //radius: getValueFromJson(data, 'name').length > 6 ?  ['40%', '84px'] :  ['46%','90px'],
				 radius: '55%',
                avoidLabelOverlap: true,
                minAngle: 5,
                label: {
                	align: 'left',
                	normal: {
                        show: show,
						lineHeight:30,
						textStyle: {fontFamily:'Microsoft Yahei'},
						formatter(v) {
                            let text = Math.round(v.percent)+'%' + '' + v.name
                            if(text.length <= 8)
                            {
                                return text;
                            }else if(text.length > 8 && text.length <= 16){
                                return text = `${text.slice(0,8)}\n${text.slice(8)}`
                            }else if(text.length > 16 && text.length <= 24){
                                return text = `${text.slice(0,8)}\n${text.slice(8,16)}\n${text.slice(16)}`
                            }else if(text.length > 24 && text.length <= 30){
                                return text = `${text.slice(0,8)}\n${text.slice(8,16)}\n${text.slice(16,24)}\n${text.slice(24)}`
                            }else if(text.length > 30){
                                return text = `${text.slice(0,8)}\n${text.slice(8,16)}\n${text.slice(16,24)}\n${text.slice(24,30)}\n${text.slice(30)}`
                            }
                        },
						rich: {  
							color1: {  
								color: '#000000',
								fontSize: 14,
								lineHeight:12,
								fontWeight:600
							},  
							color2: {  
								color: '#848484'  ,
								fontSize: 12,
							}  
						},  
                    }, emphasis: {
                        show: !show,
						textStyle: {fontSize: 12,color:'#000000',fontFamily:'Microsoft Yahei'},
                        formatter: function (params) {
                            return params.data.name + ": " + fmoneyf(params.data.value, 0) + "(" + params.percent + "%)";
                        }
                    }
                },
				
				labelLine:{
					length:10,
					length2:100,
					lineStyle:{
						color:'#848484',
						
					}
				},
                data: data,
                color:getValueFromJson(data, 'color'),
            }
        ]
    };
    myChart.setOption(option);
}

4.主要代码段:

series: [
            {
                name: name,
                x: 'left',  
                y: 'center', 
                type: 'pie',
				center:['50%', '60%'],
                //radius: getValueFromJson(data, 'name').length > 6 ?  ['40%', '84px'] :  ['46%','90px'],
				 radius: '55%',
                avoidLabelOverlap: true,
                minAngle: 5,
                label: {
                	align: 'left',
                	normal: {
                        show: show,
						lineHeight:30,
						textStyle: {fontFamily:'Microsoft Yahei'},
						formatter(v) {//此方法为核心代码,解决问题
                            let text = Math.round(v.percent)+'%' + '' + v.name
                            if(text.length <= 8)
                            {
                                return text;
                            }else if(text.length > 8 && text.length <= 16){
                                return text = `${text.slice(0,8)}\n${text.slice(8)}`
                            }else if(text.length > 16 && text.length <= 24){
                                return text = `${text.slice(0,8)}\n${text.slice(8,16)}\n${text.slice(16)}`
                            }else if(text.length > 24 && text.length <= 30){
                                return text = `${text.slice(0,8)}\n${text.slice(8,16)}\n${text.slice(16,24)}\n${text.slice(24)}`
                            }else if(text.length > 30){
                                return text = `${text.slice(0,8)}\n${text.slice(8,16)}\n${text.slice(16,24)}\n${text.slice(24,30)}\n${text.slice(30)}`
                            }
                        },
						rich: {  
							color1: {  
								color: '#000000',
								fontSize: 14,
								lineHeight:12,
								fontWeight:600
							},  
							color2: {  
								color: '#848484'  ,
								fontSize: 12,
							}  
						},  
                    }, emphasis: {
                        show: !show,
						textStyle: {fontSize: 12,color:'#000000',fontFamily:'Microsoft Yahei'},
                        formatter: function (params) {
                            return params.data.name + ": " + fmoneyf(params.data.value, 0) + "(" + params.percent + "%)";
                        }
                    }
                },

ps:转载的

### 如何解决 ECharts 饼状图图块颜色重叠问题 在处理 ECharts 饼状图时,遇到的颜色重叠问题通常不是由于颜色本身重叠引起,而是因为配置不当或数据量过大造成的视觉混淆。为了有效解决问题并优化图表展示效果: #### 1. 使用渐变色方案 通过定义一系列连续变化的颜色来区分不同的扇区,可以减少相邻区域之间的干扰感。 ```javascript color: ['#c23531','#2f4554', '#61a0a8', '#d48265', '#91c7ae','#749f83', '#ca8622', '#bda29a','#6e7074', '#546570', '#c4ccd3'] ``` 此段代码展示了如何自定义一组色彩用于饼图着色[^1]。 #### 2. 设置合理的透明度 适当调整各部分的 `itemStyle.opacity` 属性值,在保持整体美观的同时增加层次分明的效果。 ```json { itemStyle: { opacity: 0.8 // 调整此处数值控制透明程度 } } ``` 该属性允许设定每个片段的具体样式特征,包括但不限于填充色、边框宽度等参数[^2]。 #### 3. 启用高亮交互功能 当鼠标悬停于某个特定项之上时自动放大显示其细节信息,从而让用户更容易识别各个组成部分而不至于感到混乱。 ```json emphasis: { scale: true, focus: 'self' } ``` 上述设置使得被选中的元素能够得到突出表现,增强用户体验。 #### 4. 控制最大最小角度 对于占比极小的数据条目,可以通过限定最低限度的角度阈值防止它们变得难以察觉;同样也可以规定上限避免某些项目占据过多空间影响其他成员呈现。 ```json series: [{ type: 'pie', minAngle: 15, // 单位为度数,默认情况下会尽可能分配剩余的空间给较小的部分直到达到这个下限为止 }] ``` 这种做法有助于维持整个图形结构上的平衡谐美感。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值