ECharts饼图试玩
处理类似提交问卷的数据,要生成图表,用了ECharts,好方便的。
简陋效果:
1.表单存储
有单选和多选题,单选直接存储各选项数字值,1,2,3,4...中一个;多选用|分隔存储选项值,如1|3,2|3|4
数据库存储后如下:
2.ECharts饼图
ECharts官网,以及新手上路都很清楚,饼图很简单:配置和数据如下示例
option = { title: { text: '名称', }, series : [ { type: 'pie', radius: '56%', data:[ {value:235, name:'视频广告'}, {value:274, name:'联盟广告'}, {value:310, name:'邮件营销'}, {value:335, name:'直接访问'}, {value:400, name:'搜索引擎'} ] } ] };
radius是饼图的半径,基于有高宽的DOM容器。
3.使用数据
SQL查出数据,把需要的数据输出到series的data即可:
1 <?php 2 $data=array( //data数组是需要输出的列分析饼图 3 '性别','年龄','年级','学科',..... 4 ); 5 foreach($data as $k=>$v){ 6 $x=$k+1; 7 echo '<div id="main'.$x.'" style="width:400px;height:300px" class="main"></div>'; 8 echo " 9 <script type='text/javascript'> 10 var myChart$x = echarts.init(document.getElementById('main".($x)."')); 11 var option = { 12 title: { 13 text: '".$v."', 14 show:false 15 }, 16 series : [ 17 { 18 type: 'pie', 19 radius: '55%', 20 data:["; 21 echo redata($k); 22 echo " 23 ], itemStyle:{ 24 normal:{ 25 label:{ 26 show: true, 27 formatter: '{b}{c}({d}%)' 28 }, 29 labelLine :{show:true} 30 } 31 } 32 }] 33 }; 34 myChart$x.setOption(option); 35 </script>"; 36 } 37 ?>
循环出需要展示的列,执行自定义函数redata($id)每次返回需要的值,新东西normal:formatter主要是为了输出百分比(所以才说特别方便,全交给库处理了拜托你了),手册里有介绍。
到这里,已经解决了饼图测试数据怎么放,然而数据如何获取并返回?只需要得到如下格式数据即可:
{value:23, name:'吃饭'},
{value:24, name:'起床'}
4.数据库获取数据
$sql="select $names as skey,count($names) as snum from `tablename` group by $names";
$names是需要获取的列名,比如需要age列数据
把这4条数据循环并成字符串: {value:235, name:'视频广告'} 这种就好。name如何来,就得规定好age选1时输出啥,age选2时输出啥,...:(示例的外层case 2是年龄对应的代码段)
case 2: { switch($row['skey']){ case 1: $rowname='大一'; break; case 2: $rowname='大二'; break; case 3: $rowname='大三'; break; case 4: $rowname='大四'; break; case 5: $rowname='其他'; break; } } break; ...其他有意义的代码 $rowname.='\n';//并入换行 $redata.="{value:".$row['snum'].", name:'".$rowname."'},";
$redata就是要返回的series:data段,最后别忘记去掉$redata多余的(,)英文逗号。
上面的只是单选数据,对于多选数据用同样的sql语句会出如下结果,以tvgoal字段为例:
WTF?直接把数据内容去分组算总和了,无效的数据,修正后:
一次查一条记录中某值(图中为2,字段为tvgoal)的总数。代码段:
case 5: { $namearr=array('韩剧','美剧','日剧','台剧','港剧','泰剧','内地','无所谓'); for($i=1;$i<=count($namearr);$i++){ $sql="select count(*) as snum from `tablename` where $i in (select replace(`各字段`,'|',',')) "; $data=$ph->query($sql); if($row=$ph->fetcharray($data)){ $rowname=$namearr[$i-1]; $rowname.='\n'; $redata.="{value:".$row['snum'].", name:'".$rowname."'},"; } } } break;
其中,case 5是tvgoal的代码,而且,$namearr数组各值选项value为1,2,3,4,5...对应,才可依赖上述代码。别吐槽原生的查询=。=。顺便一说,这些数据也是虚拟出来的。
暂完。