• 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="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.='
    ';//并入换行
    $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.='
    ';
                    $redata.="{value:".$row['snum'].", name:'".$rowname."'},";
                }
            }
        }
        break;

    其中,case 5是tvgoal的代码,而且,$namearr数组各值选项value为1,2,3,4,5...对应,才可依赖上述代码。别吐槽原生的查询=。=。顺便一说,这些数据也是虚拟出来的。

    暂完。

  • 相关阅读:
    AJAX的使用
    django.template.exceptions.TemplateDoesNotExist: login.html报错
    cookie、session
    关于zipfile解压出现的字符编码问题
    使用jquery清空input 文本框中的内容
    DVWA SQL-injection 附python脚本
    关于itchat用法的一篇博文
    记录两个python itchat的用法博客网址
    pyinstaller 打包.exe文件记录遇到的问题
    用python编写的excel拆分小工具
  • 原文地址:https://www.cnblogs.com/warcraft/p/6137630.html
Copyright © 2020-2023  润新知