Echarts 饼图 动态数据比例 处理干货

前段时间想做一个统计数据人气指数高低,打算做一个饼图,可以一目了然很直观的看出报名,点击…高低之分
这个处理 只是自己涉及到的层面,简单了然没有深入
详细见官网开发文档 饼图开发文档
官方实例饼图 实例
JS插件:(csdn有人上传 我没权限在上传,各位自己找吧)

从两方面一个PHP动态数据层 一个是从HTML饼图展示 (直接代码)

PHP

数据需要自己整合,说白了就是所占比列,查询数据方面自己处理,但是一定要处理一下数据占总数的比例是多少! 涉及到的函数有
//叠加处理 总和简单 (怕自己忘了写上了) $sum = 0; $sum += $val['num'];

//第二块是 四舍五入保留两位小数 单个数据占比 上层是foreach循环 数据格式下边贴出来
 $bl_lv = round($value['num']/$sum,2)*100; 

暂且命名这个数组叫data PHP处理一下 json_encode($data);

//二维数组 bl_lv 就是扇形占比
Array
(
    [0] => Array
        (
            [cate_id] => 57
            [cate_name] => aa
            [num] => 86
            [bl_lv] => 15
        )
    [1] => Array
        (
            [cate_id] => 16
            [cate_name] => bb
            [num] => 65
            [bl_lv] => 11
        )

    [2] => Array
        (
            [cate_id] => 14
            [cate_name] => cc
            [num] => 36
            [bl_lv] => 6
        )
 )

HTML CSS JQ

引入好插件

//html很简单有地方展示就行
<div class="chart1">
	<div id="chart"></div>
</div>
<style>
    .chart1{
        width: 95%;
        height: 400px;
    }
</style>

JQ 这里边看我的注释

</script>
	//json数据后台 assign传过来的
	var datas = '<{$js_data}>';
	//处理一下json 数据(没啥可说的)
	var json_data = JSON.parse(datas);
	//创建多个 空数组 接受处理使用
	var NameData = [];
	var AllData = [];
	var Other = 'Other';
	var count = 0;
	var data_num = 0;
	//遍历数据 类似foreach 循环处理 item等同于value,index类似于key键值
	json_data.forEach(function(item,index) {
		//这个数据需要 因为我只需要排名前19位的,其余用other代替,整合后边所有的lilv
		//(比如一共30条数 我只要前20 后10个 用other代替也不显示具体名字,利率归总为(100减 前19名利率和))
		if(index < 19){
			NameData.push(item.cate_name);
		    AllData.push({
		        value: item.bl_lv,
		        name: item.cate_name
		    });	
		}else{
			count += item.bl_lv; 
		}
	})
	//如果count存在 代表数据多余19条 多余单独处理 注意使用push增添数据
	//标准的数据格式是这样的 
	//       	  {value:335, name:'直接访问'},
     //           {value:310, name:'邮件营销'},
     //           {value:234, name:'联盟广告'},
     //           {value:135, name:'视频广告'},
     //           {value:1548, name:'搜索引擎'}
	if(count > 0){
		NameData.push(Other);
	    AllData.push({
	        value: count,
	        name: Other
	    });
	}	
	drawCharts(NameData, AllData);
    function drawCharts(NameData, AllData){
        option = {
            tooltip: {
                trigger: 'item',
                formatter: "{a} <br/>{b}:({d}%)"
            },
            legend: {
                orient: 'vertical',
                x: 'right',
                data: NameData,
            },   
            //颜色 注重说下 我20条数据 默认是10条数据中颜色不会重复 没办法我自己设置了20个色卡 这个注意下 颜色别重叠
            color:['#c23531', '#2f4554','#61a0a8','#d48265','#91c7ae','#ca8622','#bda29a','#6e7074','#546570','#749f83','#ffb74d','#ff7043','#bcaaa4','#efebe9','#424242','#78909c','#ef9a9a','#f8bbd0','#263238','#e88769'
            ],
            series: [
                {
                    name:'人气指数',
                    type:'pie',
                    radius: ['50%', '70%'],
                    //官方文档解释是 这个例子中需要强制所有标签放在中心位置,可以将该值设为 false。
                    avoidLabelOverlap: false,
                    label: {
                    	//字体处理样式 居中...
                        normal: {
                            show: false,
                            position: 'center'
                        },
                        emphasis: {
                            show: true,
                            textStyle: {
                            	//圈内字体大小 
                                fontSize: '30',
                                fontWeight: 'bold'
                            }
                        }
                    },
                    labelLine: {
                        normal: {
                            show: false
                        }
                    },
                    data: AllData
                }
            ]
        };
        //chart 就是上边html的id
        echartsPacking('chart', option);
    }
	//这一堆 是为了页面自适应处理的 不用刻意理解 知道 id是啥 option是就行
    function echartsPacking(id, option){
        //图表id  设置function
        var worldMapContainer = document.getElementById(id);
        var resizeWorldMapContainer = function () {
            worldMapContainer.style.width = '100%';
            worldMapContainer.style.height = '100%';
        };
        resizeWorldMapContainer();
        var myChart = echarts.init(worldMapContainer);
        myChart.setOption(option);
        window.onresize = function () {
            resizeWorldMapContainer();
            myChart.resize();
        };
    }
</script>

效果图
在这里插入图片描述
大概就这些 上边也有官方文档和实例 注意事项看代码注释,为了数据活起来 !!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值