精华内容
下载资源
问答
  • web开发中常用的几种统计图使用

    千次阅读 2015-11-14 15:22:31
    最近,笔者结合自己在公司项目使用统计图的经验以及自己的研究,对地图统计、柱形图统计、饼图统计以及折线图统计这几常用的统计作以归纳。主要使用到的js框架是highstock.js,一完全基于javascript的前端框架。...

    最近,笔者结合自己在公司项目使用统计图的经验以及自己的研究,对地图统计、柱形图统计、饼图统计以及折线图统计这几种常用的统计作以归纳。主要使用到的js框架是highstock.js,一种完全基于javascript的前端框架。接下来,一一进行讲解。

    一、地图统计

    这里写图片描述
    这里,地图使用的插件是fusionmaps,是离线的.swf格式的图片。首先,来看看menu1.jsp:

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%
      String path = request.getContextPath();
      String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
    %>
    <!DOCTYPE html>
    <html>
    <head>
    <base href="<%=basePath%>">
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <meta http-equiv="Cache-Control" CONTENT="no-cache">
    <title>Menu1</title>
    <link rel="stylesheet" type="text/css" href="resources/jquery-easyui-1.4.2/themes/default/easyui.css">
    <link rel="stylesheet" type="text/css" href="resources/jquery-easyui-1.4.2/themes/icon.css">
    </head>
    <body>
    <h2>地图统计</h2>
    
    <div id='dataForMap' style="height: 485px;">
    
    <script type="text/javascript" src="resources/jquery-easyui-1.4.2/jquery-1.8.0.js"></script>
    <script type="text/javascript" src="resources/jquery-easyui-1.4.2/jquery.easyui.min.js"></script>
    <script type="text/javascript" src="js/plugs/fusionmaps/FusionCharts.js"></script>
    <script type="text/javascript" src="resources/logicJS/graph/menu1.js"></script>
    </body>
    </html>

    对应的menu1.js:

    $(function() {
      console.log('开始加载地市图。。。');
      //地图基本样式
      var MAP_STYLE = "<map " + "baseFontSize='11' " + "baseFontColor='363636' "
          + "fillAlpha='100' " + "hoverColor='CAE7F0' " + "BorderColor='ffffff' "
          + "showBevel='0' " + "formatNumberScaleBoolean='0' "
          + "showShadow='0' animation='1' " + "legendScrollBtnColor='ffffff' "
          + "showCanvasBorder='0' " + "showToolTipShadow='0' "
          + "toolTipBorderColor='ffffff' " + "showLegend='0' "
          + "legendBorderThickness='0' " + "legendBorderColor='ffffff' "
          + "legendShadow='0'>";
      //颜色数组
      var colorArr = [ '#A4EDFF', '#56D9FF', '#01C0F7', '#169EFF', '#0082DE',
          '#006DBA' ];
      //设置不同分类的颜色
      var kindStatCharXml = MAP_STYLE + "<colorRange>"
          + "<color minValue='1' maxValue='10' color='" + colorArr[0] + "' />"
          + "<color minValue='11' maxValue='100' color='" + colorArr[1] + "' />"
          + "<color minValue='101' maxValue='1000' color='" + colorArr[2] + "' />"
          + "<color minValue='1001' maxValue='10000' color='" + colorArr[3]
          + "' />" + "<color minValue='10001' maxValue='100000' color='"
          + colorArr[4] + "' />"
          + "<color minValue='100001' maxValue='1000000' color='" + colorArr[5]
          + "' />" + "</colorRange><data>";
      //模拟的数据
      var data = [ {
        remark : 'CN.ZJ',
        name : '浙江',
        countNum : 179734
      }, {
        remark : 'CN.BJ',
        name : '北京',
        countNum : 111
      }, {
        remark : 'CN.FJ',
        name : '福建',
        countNum : 222
      }, {
        remark : 'CN.SH',
        name : '上海',
        countNum : 933734
      }, {
        remark : 'CN.JS',
        name : '江苏',
        countNum : 9334
      }, {
        remark : 'CN.AH',
        name : '安徽',
        countNum : 734
      },{
        remark : 'CN.XJ',
        name : '新疆',
        countNum : 7334
      },{
        remark : 'CN.AH',
        name : '安徽',
        countNum : 7234
      },{
        remark : 'CN.XZ',
        name : '西藏',
        countNum : 734
      },{
        remark : 'CN.QH',
        name : '青海',
        countNum : 1734
      },{
        remark : 'CN.GS',
        name : '甘肃',
        countNum : 7354
      } ];
      //遍历数据
      for (var i = 0; i < data.length; i++) {
        var one = data[i];
        kindStatCharXml = kindStatCharXml + "<entity id='" + one.remark + "' "
            + "displayValue='" + one.name + "' " + "value='" + one.countNum + "' "
            + "toolText='" + one.name + "," + one.countNum + "' link='http://www.baidu.com?remark=" + one.remark +"'/> "
      }
    
      kindStatCharXml = kindStatCharXml + " </data> </map>";
      var showChart1 = new FusionCharts("js/plugs/fusionmaps/swf/FCMap_China2.swf",
          "chart1", '100%', '100%', "0", "0");
      showChart1.setDataXML(kindStatCharXml);
      showChart1.render('dataForMap');
    });

    二、柱形图统计

    这里写图片描述
    柱形图、饼图、折线图都是使用的highstock插件,下面直接贴出代码。
    jsp代码:

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%
      String path = request.getContextPath();
      String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
    %>
    <!DOCTYPE html>
    <html>
    <head>
    <base href="<%=basePath%>">
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <meta http-equiv="Cache-Control" CONTENT="no-cache">
    <title>Menu2</title>
    <link rel="stylesheet" type="text/css" href="resources/jquery-easyui-1.4.2/themes/default/easyui.css">
    <link rel="stylesheet" type="text/css" href="resources/jquery-easyui-1.4.2/themes/icon.css">
    <style type="text/css">
    a:link { text-decoration: none;color: blue}
    a:active { text-decoration:blink}
    a:hover { text-decoration:underline;color: red} 
    a:visited { text-decoration: none;color: green}
    </style>
    </head>
    <body>
    <h2>柱形图统计</h2>
    
    <div style="margin-top:40px;width:100%" id='dataForColumn'></div>
    
    <script type="text/javascript" src="resources/jquery-easyui-1.4.2/jquery-1.8.0.js"></script>
    <script type="text/javascript" src="resources/jquery-easyui-1.4.2/jquery.easyui.min.js"></script>
    <script type="text/javascript" src="js/plugs/highstock/highstock.js"></script>
    <script type="text/javascript" src="resources/logicJS/graph/menu2.js"></script>
    </body>
    </html>

    js代码:

    $(function() {
      console.log('开始加载柱形图。。。');
    
      //模拟数据
      var data = [{
        code: '百度',
        countNum:10,
        count1Num:11
      },{
        code: '谷歌',
        countNum:100,
        count1Num:50
      },{
        code: '360',
        countNum:30,
        count1Num:41
      },{
        code: '新浪',
        countNum:70,
        count1Num:51
      },{
        code: '阿里',
        countNum:80,
        count1Num:15
      }];
    
      //男数组
      var manArray = [];
    
      //女数组
      var womanArray = [];
    
      //业务类型值数组
      var categories = [];
    
      //男生比率map
      var sexRateMap = [];
    
      for(var i = 0; i < data.length; i++) {
        manArray.push(data[i].countNum);
        womanArray.push(data[i].count1Num);
        categories.push(data[i].code);
    
        //计算比率,保留1位小数
        sexRateMap[data[i].code] = (data[i].countNum / (data[i].countNum + data[i].count1Num) * 100).toFixed(1) + '%';
      }
    
      //创建柱形图
      $('#dataForColumn').highcharts({
        chart: {
            type: 'column'
        },
        title: {
            text: '企业员工性别统计(个数)'
        },
        xAxis: {
            categories: categories,
            crosshair: true,
            labels: {
              rotation:-90
            }
        },
        yAxis: {
            min: 0,
            title: {
                text: '个数'
            }
        },
        tooltip: {
          formatter: function() {
            var html = '<span style="font-size:10px">' + this.x + '</span><table>';
            for (var i = 0; i < this.points.length; i ++) {
              var point = this.points[i];
              if (point.series.name == '男') {
                html += '<tr><td style="color:#0a6ea1;padding:0">男: </td>';
                html += '<td style="padding:0"><a href="http://blog.csdn.net/qiyongkang520" style=""><b>' + point.y + '个</b></a></td></tr>';
              } else if (point.series.name == '女') {
                html += '<tr><td style="color:#274b6d;padding:0">女: </td>';
                html += '<td style="padding:0"><a href="http://blog.csdn.net/qiyongkang520"><b>' + point.y + '个</b></a></td></tr>';
              }
            }
            html += '<tr><td style="padding:0">男生比率:</td><td style="padding:0">' + sexRateMap[this.x] + '</td></tr></table>';
            return html;
          },
          shared: true,
          useHTML: true
        },
        plotOptions: {
            column: {
                pointPadding: 0.2,
                borderWidth: 0
            }
        },
        credits:{
          enabled: true,
          href: "http://blog.csdn.net/qiyongkang520",
          text: 'qiyongkang'
        },
        series: [{
            name: '男',
            data: manArray
        }, {
            name: '女',
            data: womanArray
        }]
      });
    
    });

    三、饼图统计

    这里写图片描述
    jsp代码:

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%
      String path = request.getContextPath();
      String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
    %>
    <!DOCTYPE html>
    <html>
    <head>
    <base href="<%=basePath%>">
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <meta http-equiv="Cache-Control" CONTENT="no-cache">
    <title>Menu3</title>
    <link rel="stylesheet" type="text/css" href="resources/jquery-easyui-1.4.2/themes/default/easyui.css">
    <link rel="stylesheet" type="text/css" href="resources/jquery-easyui-1.4.2/themes/icon.css">
    <style type="text/css">
    a:link { text-decoration: none;color: blue}
    a:active { text-decoration:blink}
    a:hover { text-decoration:underline;color: red} 
    a:visited { text-decoration: none;color: green}
    </style>
    </head>
    <body>
    <h2>饼图统计</h2>
    
    <div style="margin-top:40px;width:100%" id='dataForPie'></div>
    
    <script type="text/javascript" src="resources/jquery-easyui-1.4.2/jquery-1.8.0.js"></script>
    <script type="text/javascript" src="resources/jquery-easyui-1.4.2/jquery.easyui.min.js"></script>
    <script type="text/javascript" src="js/plugs/highstock/highstock.js"></script>
    <script type="text/javascript" src="resources/logicJS/graph/menu3.js"></script>
    </body>
    </html>

    js代码:

    $(function() {
      console.log('开始加载饼图。。。');
    
      //模拟数据
      var data = [['武昌区', 100], ['洪山区', 200], ['江夏区', 300], ['其它', 250]];
    
      //创建饼图
      $("#dataForPie").highcharts({
        chart : {
          plotBackgroundColor : null,
          plotBorderWidth : null,
          plotShadow : false
        },
        title : {
          text : '武汉市各地区人数统计'
        },
        plotOptions : {
          pie : {
            allowPointSelect : true,
            cursor : 'pointer',
            dataLabels : {
              enabled : true,
    //          format : '<b>{point.name}</b>: <a href="http://blog.csdn.net/qiyongkang520">{point.percentage:.1f} %</a>'
              formatter: function() {
                var html = '';
                html += '<b>' + this.point.name + '</b>:<a href="http://blog.csdn.net/qiyongkang520">';
                html += this.percentage.toFixed(1) + '%</a>';
                return html;
              }
            },
            showInLegend : true
          }
        },
        credits : {
          enabled : true,
          href: "http://blog.csdn.net/qiyongkang520",
          text: 'qiyongkang'
        },
        series : [ {
          type : 'pie',
          name : '各区人数统计',
          data : data
        } ]
      });
    
    });

    四、折线图

    这里写图片描述
    jsp代码:

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%
      String path = request.getContextPath();
      String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
    %>
    <!DOCTYPE html>
    <html>
    <head>
    <base href="<%=basePath%>">
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <meta http-equiv="Cache-Control" CONTENT="no-cache">
    <title>Menu4</title>
    <link rel="stylesheet" type="text/css" href="resources/jquery-easyui-1.4.2/themes/default/easyui.css">
    <link rel="stylesheet" type="text/css" href="resources/jquery-easyui-1.4.2/themes/icon.css">
    <style type="text/css">
    a:link { text-decoration: none;color: blue}
    a:active { text-decoration:blink}
    a:hover { text-decoration:underline;color: red} 
    a:visited { text-decoration: none;color: green}
    </style>
    </head>
    <body>
    <h2>折线图统计</h2>
    
    <div style="margin-top:40px;width:100%" id='dataForLine'></div>
    
    <script type="text/javascript" src="resources/jquery-easyui-1.4.2/jquery-1.8.0.js"></script>
    <script type="text/javascript" src="resources/jquery-easyui-1.4.2/jquery.easyui.min.js"></script>
    <script type="text/javascript" src="js/plugs/highstock/highstock.js"></script>
    <script type="text/javascript" src="resources/logicJS/graph/menu4.js"></script>
    </body>
    </html>

    js代码:

    $(function() {
      console.log('开始加载折线图。。。');
      // 模拟数据
      var data = '["[Date.UTC(2014,3,20),972,55]","[Date.UTC(2014,3,21),4332,452]","[Date.UTC(2014,3,22),687,45]","[Date.UTC(2014,3,23),1012,57]","[Date.UTC(2014,3,24),838,40]","[Date.UTC(2014,3,25),876,47]","[Date.UTC(2014,3,26),850,43]","[Date.UTC(2014,3,27),918,56]","[Date.UTC(2014,3,28),808,39]","[Date.UTC(2014,3,29),388,14]","[Date.UTC(2014,3,30),74,8]","[Date.UTC(2014,4,1),43,3]","[Date.UTC(2014,4,2),33,3]","[Date.UTC(2014,4,3),50,7]","[Date.UTC(2014,4,4),51,8]","[Date.UTC(2014,4,5),66,3]","[Date.UTC(2014,4,6),24,4]","[Date.UTC(2014,4,7),16,2]","[Date.UTC(2014,4,8),34,4]","[Date.UTC(2014,4,9),65,9]","[Date.UTC(2014,4,10),46,7]","[Date.UTC(2014,4,11),23,2]","[Date.UTC(2014,4,12),59,7]","[Date.UTC(2014,4,13),52,8]","[Date.UTC(2014,4,14),53,5]","[Date.UTC(2014,4,15),56,5]","[Date.UTC(2014,4,16),33,2]","[Date.UTC(2014,4,17),24,3]","[Date.UTC(2014,4,18),30,2]","[Date.UTC(2014,4,19),38,4]","[Date.UTC(2014,4,20),23,1]","[Date.UTC(2014,4,21),41,6]","[Date.UTC(2014,4,22),27,0]","[Date.UTC(2014,4,23),15,1]","[Date.UTC(2014,4,26),163,16]","[Date.UTC(2014,4,27),630,42]","[Date.UTC(2014,4,28),404,14]","[Date.UTC(2014,4,29),418,18]","[Date.UTC(2014,4,30),397,20]","[Date.UTC(2014,4,31),192,10]","[Date.UTC(2014,5,1),109,6]","[Date.UTC(2014,5,2),119,7]","[Date.UTC(2014,5,3),265,8]","[Date.UTC(2014,5,4),208,12]","[Date.UTC(2014,5,5),75,4]","[Date.UTC(2014,5,6),156,6]","[Date.UTC(2014,5,7),286,11]","[Date.UTC(2014,5,8),44,2]","[Date.UTC(2014,5,11),131,10]","[Date.UTC(2014,5,12),404,22]","[Date.UTC(2014,5,13),50,4]","[Date.UTC(2014,5,14),4,1]","[Date.UTC(2014,5,15),21,0]","[Date.UTC(2014,5,16),31,2]","[Date.UTC(2014,5,18),28,0]","[Date.UTC(2014,5,19),97,4]","[Date.UTC(2014,5,20),85,1]","[Date.UTC(2014,5,21),4060,54]","[Date.UTC(2014,5,22),2646,45]","[Date.UTC(2014,5,23),1688,31]","[Date.UTC(2014,5,24),1349,30]","[Date.UTC(2014,5,25),2605,46]","[Date.UTC(2014,5,26),2125,27]","[Date.UTC(2014,5,27),1360,33]","[Date.UTC(2014,5,28),1337,43]","[Date.UTC(2014,5,29),672,21]","[Date.UTC(2014,5,30),447,10]","[Date.UTC(2014,6,1),1985,50]","[Date.UTC(2014,6,2),1307,24]","[Date.UTC(2014,6,3),1319,34]","[Date.UTC(2014,6,4),832,27]","[Date.UTC(2014,6,5),683,12]","[Date.UTC(2014,6,6),691,16]","[Date.UTC(2014,6,7),416,9]","[Date.UTC(2014,6,8),373,7]","[Date.UTC(2014,6,9),455,11]","[Date.UTC(2014,6,10),540,14]","[Date.UTC(2014,6,11),498,14]","[Date.UTC(2014,6,12),361,11]","[Date.UTC(2014,6,13),474,15]","[Date.UTC(2014,6,14),447,14]","[Date.UTC(2014,6,15),544,14]","[Date.UTC(2014,6,16),477,11]","[Date.UTC(2014,6,17),503,13]","[Date.UTC(2014,6,18),196,7]","[Date.UTC(2014,6,19),527,15]","[Date.UTC(2014,6,20),519,14]","[Date.UTC(2014,6,21),287,2]","[Date.UTC(2014,6,22),430,9]","[Date.UTC(2014,6,23),459,11]","[Date.UTC(2014,6,24),429,11]","[Date.UTC(2014,6,25),936,15]","[Date.UTC(2014,6,26),763,10]","[Date.UTC(2014,6,27),545,8]","[Date.UTC(2014,6,28),555,4]","[Date.UTC(2014,6,29),471,7]","[Date.UTC(2014,6,30),295,6]","[Date.UTC(2014,6,31),127,0]","[Date.UTC(2014,7,1),251,9]","[Date.UTC(2014,7,2),232,6]","[Date.UTC(2014,7,3),168,5]","[Date.UTC(2014,7,4),136,3]","[Date.UTC(2014,7,5),218,10]","[Date.UTC(2014,7,6),220,5]","[Date.UTC(2014,7,7),234,8]","[Date.UTC(2014,7,8),239,4]","[Date.UTC(2014,7,9),277,3]","[Date.UTC(2014,7,10),262,5]","[Date.UTC(2014,7,11),220,6]","[Date.UTC(2014,7,12),10,0]","[Date.UTC(2014,7,14),10,0]","[Date.UTC(2014,7,16),436,6]","[Date.UTC(2014,7,17),351,13]","[Date.UTC(2014,7,18),335,13]","[Date.UTC(2014,7,19),30,1]","[Date.UTC(2014,7,20),182,15]","[Date.UTC(2014,7,21),331,13]","[Date.UTC(2014,7,22),292,3]","[Date.UTC(2014,7,23),507,23]","[Date.UTC(2014,7,24),9,2]","[Date.UTC(2014,7,26),1,0]","[Date.UTC(2014,7,27),733,16]","[Date.UTC(2014,7,28),603,18]","[Date.UTC(2014,7,29),507,20]","[Date.UTC(2014,7,30),636,29]","[Date.UTC(2014,7,31),432,16]","[Date.UTC(2014,8,1),339,16]","[Date.UTC(2014,8,2),212,7]","[Date.UTC(2014,8,3),321,4]","[Date.UTC(2014,8,5),615,21]","[Date.UTC(2014,8,6),395,5]","[Date.UTC(2014,8,7),136,11]","[Date.UTC(2014,8,8),8,0]","[Date.UTC(2014,8,10),633,22]","[Date.UTC(2014,8,11),21,1]","[Date.UTC(2014,8,12),261,7]","[Date.UTC(2014,8,13),374,8]","[Date.UTC(2014,8,14),318,11]","[Date.UTC(2014,8,15),236,5]","[Date.UTC(2014,8,16),190,4]","[Date.UTC(2014,8,17),135,4]","[Date.UTC(2014,8,18),231,11]","[Date.UTC(2014,8,19),248,14]","[Date.UTC(2014,8,20),393,14]","[Date.UTC(2014,8,21),268,12]","[Date.UTC(2014,8,22),314,12]","[Date.UTC(2014,8,23),228,5]","[Date.UTC(2014,8,24),167,11]","[Date.UTC(2014,8,25),192,8]","[Date.UTC(2014,8,26),199,6]","[Date.UTC(2014,8,27),182,8]","[Date.UTC(2014,8,28),141,2]","[Date.UTC(2014,8,29),254,7]","[Date.UTC(2014,8,30),388,11]","[Date.UTC(2014,9,1),498,13]","[Date.UTC(2014,9,2),1669,38]","[Date.UTC(2014,9,3),1155,33]","[Date.UTC(2014,9,4),449,28]","[Date.UTC(2014,9,5),248,12]","[Date.UTC(2014,9,6),164,6]","[Date.UTC(2014,9,9),203,3]","[Date.UTC(2014,9,10),10,0]","[Date.UTC(2014,9,11),833,39]","[Date.UTC(2014,9,12),269,14]","[Date.UTC(2014,9,13),159,11]","[Date.UTC(2014,9,14),212,7]","[Date.UTC(2014,9,15),206,9]","[Date.UTC(2014,9,16),288,7]","[Date.UTC(2014,9,17),223,6]","[Date.UTC(2014,9,18),284,10]","[Date.UTC(2014,9,19),227,9]","[Date.UTC(2014,9,20),177,11]","[Date.UTC(2014,9,21),154,6]","[Date.UTC(2014,9,22),124,9]","[Date.UTC(2014,9,24),420,14]","[Date.UTC(2014,9,25),63,7]","[Date.UTC(2014,9,28),440,21]","[Date.UTC(2014,9,29),305,7]","[Date.UTC(2014,9,30),263,11]","[Date.UTC(2014,9,31),480,16]","[Date.UTC(2014,10,1),354,17]","[Date.UTC(2014,10,2),235,11]","[Date.UTC(2014,10,3),202,7]","[Date.UTC(2014,10,4),242,8]","[Date.UTC(2014,10,5),192,4]","[Date.UTC(2014,10,6),226,5]","[Date.UTC(2014,10,7),226,13]","[Date.UTC(2014,10,8),184,8]","[Date.UTC(2014,10,9),69,4]","[Date.UTC(2014,10,11),466,21]","[Date.UTC(2014,10,12),1,0]","[Date.UTC(2014,10,13),415,19]","[Date.UTC(2014,10,14),253,10]","[Date.UTC(2014,10,15),228,7]","[Date.UTC(2014,10,17),459,37]","[Date.UTC(2014,10,18),40,2]","[Date.UTC(2014,10,19),137,6]","[Date.UTC(2014,10,20),243,11]","[Date.UTC(2014,10,21),1004,40]","[Date.UTC(2014,10,22),1393,88]","[Date.UTC(2014,10,23),458,23]","[Date.UTC(2014,10,24),249,13]","[Date.UTC(2014,10,25),224,14]","[Date.UTC(2014,10,26),169,6]","[Date.UTC(2014,10,27),240,12]","[Date.UTC(2014,11,1),836,43]","[Date.UTC(2014,11,2),40,1]","[Date.UTC(2014,11,3),24,0]","[Date.UTC(2014,11,4),23,3]","[Date.UTC(2014,11,6),11,4]","[Date.UTC(2014,11,7),125,6]","[Date.UTC(2014,11,8),322,22]","[Date.UTC(2014,11,9),269,15]","[Date.UTC(2014,11,10),132,7]","[Date.UTC(2014,11,11),430,24]","[Date.UTC(2014,11,12),477,14]","[Date.UTC(2014,11,14),761,45]","[Date.UTC(2014,11,15),249,16]","[Date.UTC(2014,11,16),421,15]","[Date.UTC(2014,11,17),240,7]","[Date.UTC(2014,11,19),669,36]","[Date.UTC(2014,11,20),243,14]","[Date.UTC(2014,11,21),245,12]","[Date.UTC(2014,11,22),234,17]","[Date.UTC(2014,11,23),223,12]","[Date.UTC(2014,11,25),312,28]","[Date.UTC(2014,11,27),34,1]","[Date.UTC(2014,11,28),256,16]","[Date.UTC(2014,11,29),137,6]","[Date.UTC(2014,11,30),153,7]","[Date.UTC(2014,11,31),336,23]","[Date.UTC(2015,0,1),533,17]","[Date.UTC(2015,0,3),554,28]","[Date.UTC(2015,0,4),257,22]","[Date.UTC(2015,0,5),59,2]","[Date.UTC(2015,0,6),563,29]","[Date.UTC(2015,0,7),287,18]","[Date.UTC(2015,0,8),11,1]","[Date.UTC(2015,0,9),395,35]","[Date.UTC(2015,0,10),214,19]","[Date.UTC(2015,0,11),228,13]","[Date.UTC(2015,0,12),305,22]","[Date.UTC(2015,0,13),308,21]","[Date.UTC(2015,0,14),164,9]","[Date.UTC(2015,0,15),24,2]","[Date.UTC(2015,0,16),180,12]","[Date.UTC(2015,0,18),482,44]","[Date.UTC(2015,0,19),7,1]","[Date.UTC(2015,0,20),250,23]","[Date.UTC(2015,0,22),260,18]","[Date.UTC(2015,0,24),357,24]","[Date.UTC(2015,0,25),485,38]","[Date.UTC(2015,0,26),413,44]","[Date.UTC(2015,0,27),743,66]","[Date.UTC(2015,0,28),774,64]","[Date.UTC(2015,0,29),486,41]","[Date.UTC(2015,0,30),408,36]","[Date.UTC(2015,0,31),285,38]","[Date.UTC(2015,1,1),291,27]","[Date.UTC(2015,1,2),270,29]","[Date.UTC(2015,1,3),197,22]","[Date.UTC(2015,1,4),189,23]","[Date.UTC(2015,1,5),257,26]","[Date.UTC(2015,1,6),300,17]","[Date.UTC(2015,1,7),323,26]","[Date.UTC(2015,1,8),442,76]","[Date.UTC(2015,1,9),268,26]","[Date.UTC(2015,1,10),6,1]","[Date.UTC(2015,1,11),272,24]","[Date.UTC(2015,1,12),249,29]","[Date.UTC(2015,1,14),474,57]","[Date.UTC(2015,1,15),16,2]","[Date.UTC(2015,1,16),234,25]","[Date.UTC(2015,1,17),235,29]","[Date.UTC(2015,1,18),191,22]","[Date.UTC(2015,1,19),123,17]","[Date.UTC(2015,1,20),131,14]","[Date.UTC(2015,1,22),138,20]","[Date.UTC(2015,1,23),7,1]","[Date.UTC(2015,1,24),84,9]","[Date.UTC(2015,1,26),163,24]","[Date.UTC(2015,1,27),64,4]","[Date.UTC(2015,1,28),114,12]","[Date.UTC(2015,2,1),158,21]","[Date.UTC(2015,2,2),152,23]","[Date.UTC(2015,2,3),219,20]","[Date.UTC(2015,2,4),142,15]","[Date.UTC(2015,2,5),159,18]","[Date.UTC(2015,2,6),204,28]","[Date.UTC(2015,2,7),259,36]","[Date.UTC(2015,2,8),239,25]","[Date.UTC(2015,2,9),219,13]","[Date.UTC(2015,2,10),191,40]","[Date.UTC(2015,2,11),211,19]","[Date.UTC(2015,2,13),384,47]","[Date.UTC(2015,2,14),138,15]","[Date.UTC(2015,2,15),258,41]","[Date.UTC(2015,2,16),247,48]","[Date.UTC(2015,2,17),262,46]","[Date.UTC(2015,2,18),308,48]","[Date.UTC(2015,2,19),296,45]","[Date.UTC(2015,2,20),102,13]","[Date.UTC(2015,2,21),255,42]","[Date.UTC(2015,2,22),313,36]","[Date.UTC(2015,2,23),247,27]","[Date.UTC(2015,2,24),6,0]","[Date.UTC(2015,2,25),469,82]","[Date.UTC(2015,2,26),281,41]","[Date.UTC(2015,2,27),249,39]","[Date.UTC(2015,2,28),227,29]","[Date.UTC(2015,2,29),262,30]","[Date.UTC(2015,2,30),5,0]","[Date.UTC(2015,2,31),1,0]","[Date.UTC(2015,3,1),201,33]","[Date.UTC(2015,3,2),579,86]","[Date.UTC(2015,3,4),423,68]","[Date.UTC(2015,3,5),146,31]","[Date.UTC(2015,3,6),270,74]","[Date.UTC(2015,3,8),75,16]","[Date.UTC(2015,3,12),1528,381]","[Date.UTC(2015,3,14),267,86]","[Date.UTC(2015,3,15),1,0]","[Date.UTC(2015,3,16),1,0]","[Date.UTC(2015,3,18),694,203]","[Date.UTC(2015,3,20),889,194]","[Date.UTC(2015,3,21),584,112]","[Date.UTC(2015,3,22),655,139]","[Date.UTC(2015,3,23),363,56]","[Date.UTC(2015,3,24),343,71]","[Date.UTC(2015,3,29),423,79]","[Date.UTC(2015,4,1),6,2]","[Date.UTC(2015,4,2),1,0]","[Date.UTC(2015,4,3),988,253]","[Date.UTC(2015,4,5),29,6]","[Date.UTC(2015,4,7),1171,317]","[Date.UTC(2015,4,8),246,65]","[Date.UTC(2015,4,9),715,623]","[Date.UTC(2015,4,10),1158,602]","[Date.UTC(2015,4,11),5,5]","[Date.UTC(2015,4,13),1751,1578]","[Date.UTC(2015,4,14),17,17]","[Date.UTC(2015,4,16),3288,2871]","[Date.UTC(2015,4,17),1478,1268]","[Date.UTC(2015,4,18),5,4]","[Date.UTC(2015,4,19),2199,1894]","[Date.UTC(2015,4,21),2090,1847]","[Date.UTC(2015,4,22),449,382]","[Date.UTC(2015,4,23),3012,2939]","[Date.UTC(2015,4,25),368,362]","[Date.UTC(2015,4,26),2180,2110]","[Date.UTC(2015,4,27),1695,1686]","[Date.UTC(2015,4,29),343,343]","[Date.UTC(2015,4,30),102,102]","[Date.UTC(2015,5,1),80,76]"]';
    
      //去掉“,转化成对象
      var reg = new RegExp('"', "g");
      resultText = data.replace(reg, "");
      var resultJson = eval(resultText);
    
      // 创建折线图
      $('#dataForLine').highcharts('StockChart', {
        credits : {
          enabled : false,
          href : "http://blog.csdn.net/qiyongkang520",
          text : 'qiyongkang'
        },
    
        rangeSelector : {
          inputDateFormat : '%Y-%m-%d',
          buttons : [],
          selected : 5
        },
    
        xAxis : {
          dateTimeLabelFormats : {
            second : '%H:%M:%S',
            minute : '%H:%M',
            hour : '%H:%M',
            day : '%Y<br/>%m-%d',
            week : '%Y<br/>%m-%d',
            month : '%Y-%m',
            year : '%Y'
          },
          minTickInterval : 24 * 3600 * 1000
        },
    
        yAxis : {},
    
        navigator : {
          xAxis : {
            dateTimeLabelFormats : {
              second : '%H:%M:%S',
              minute : '%H:%M',
              hour : '%H:%M',
              day : '%Y-%m-%d',
              week : '%Y-%m-%d',
              month : '%Y-%m',
              year : '%Y'
            }
          }
        },
    
        title : {
          text : '每天食堂人流量变化趋势'
        },
    
        tooltip : {
          xDateFormat : '%Y-%m-%d' // 鼠标移动到趋势线上时显示的日期格式
        },
    
        series : [ {
          name : '人流量',
          data : resultJson
        } ]
      });
    
    });

    五、总结

    统计在我们的项目中经常用到,一个比较形象的统计图便很能说明问题,所以大家可以尝试去通过highstock这个插件实现,另外,highstock提供的统计图类型有很多,笔者了解也就这几个,其它的大家有兴趣也可以去研究。同时笔者写得有问题的位置也欢迎指出,谢谢!

    展开全文
  • 数据结构——四种常见的线性表

    千次阅读 2017-12-14 18:59:18
    数组、链表、栈、队列是四种常见的线性表

    数据之间常见的逻辑结构包括线性结构、关联结构(集合、映射)、树形结构、图形结构.
    线性表是数据结构中最简单的基本数据结构.
    数组、链表、栈、队列是四种最常见的线性表.

    1.数组
    对数组的基本操作有查找、插入、删除. 数组元素的直接访问几乎没有开销,但是插入和删除操作需要移动数组元素,开销比较大,因此在插入和删除操作比较频繁的场合下,不适合用数组.
    在数组中查找一个元素的时间复杂度为O(n) 如果数组元素是有序存储的,则使用二分查找可以将时间复杂度降到O(lgn)

    例子:有若干个数存放在value数组中,这些数的取值范围是[1-100],请设计一个算法统计一下这些数中相同的数出现的次数.
    解析:虽然value中数字的个数很多,但是范围并不大,所以可以设计一个有100个元素的数组,数组元素的下标对应数字,数组元素的值就是对应数字出现的次数. 虽然哪些没有出现过的数字也需要占用数组中的一个位置,但是这点空间开销是可以接受的.

    2.链表
    链表结构的每个节点数据都由两个域组成,一个是存放实际数据元素的数据域,另一个就是构成链式结构的指针域.
    单向链表:指针域只有一个后向指针
    双向链表:指针域由一个后向指针和一个前向指针组成
    链表访问数据元素的效率比较低,需要从链表头部向后搜索,查找操作的时间复杂度为O(n).
    在某些应用场合,可以将链表尾部节点的后向指针指向链表头部节点,构成一个环形链表
    对环形链表来说,无论从哪个节点开始都可以遍历整个链表
    表头节点的作用域中放置一些与链表有关的状态信息. 比如当前链中的数据元素节点个数。表头结点的指针域始终指向第一个实际链表节点,如果表头节点的指针域是null,则表示这个链表是空表.
    使用表头节点的好处:
    1.无论链表是否为空表,始终有一个能表示链表的头结点
    2.对链表进行插入、删除、遍历操作时,不需要对数据元素的首节点和中间节点做差异处理

    3.栈
    站的数据存储方式可以采用数组或链表.分别被称为”顺序栈”和”链式栈”. 利用栈的一些特性,可以将某算法的递归实现转换成非递归实现. 有时,广度优先搜索和深度优先搜索的差异仅仅是使用栈还是使用队列.
    判断表达式的括号是否匹配算法,可以使用栈这种数据结构

    4.队列
    队列和栈一样,都不是数据存储方式,而是一种逻辑管理方式.
    队列的数据存储方式可以采用数组,也可以使用链表
    队列有多种形式:环形队列、双端队列、优先级队列.
    队列在算法中的应用:图的广度优先搜索算法、操作系统中的线程调度算法、管理数据报文的发送和接收

    展开全文
  • 监督学习最常见四种算法

    万次阅读 多人点赞 2017-07-12 10:37:04
    而监督型学习(Supervised learning)就是训练样本,带属性标签,也可以理解成样本输入输出。 所有的回归算法和分类算法都属于监督学习。回归(Regression)和分类(Classification)的算法区别在于输出...

     

     

    机器学习中,无监督学习(Unsupervised learning)就是聚类,事先不知道样本的类别,通过某种办法,把相似的样本放在一起归位一类;而监督型学习(Supervised learning)就是有训练样本,带有属性标签,也可以理解成样本有输入有输出。

    所有的回归算法和分类算法都属于监督学习。回归(Regression)和分类(Classification)的算法区别在于输出变量的类型,定量输出称为回归,或者说是连续变量预测;定性输出称为分类,或者说是离散变量预测。

    以下是一些常用的监督型学习方法。

    一. K-近邻算法(k-Nearest Neighbors,KNN)

    K-近邻是一种分类算法,其思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。K通常是不大于20的整数。KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。

    knn

    如上图,绿色圆要被决定赋予哪个类,是红色三角形还是蓝色四方形?如果K=3,由于红色三角形所占比例为2/3,绿色圆将被赋予红色三角形那个类,如果K=5,由于蓝色四方形比例为3/5,因此绿色圆被赋予蓝色四方形类。

    算法的步骤为:

    (1)计算测试数据与各个训练数据之间的距离;

    (2)按照距离的递增关系进行排序;

    (3)选取距离最小的K个点;

    (4)确定前K个点所在类别的出现频率;

    (5)返回前K个点中出现频率最高的类别作为测试数据的预测分类。

    二. 决策树(Decision Trees)

    决策树是一种常见的分类方法,其思想和“人类逐步分析比较然后作出结论”的过程十分相似。决策过程和下图类似。

    decisiontree

    决策树是一个树结构(可以是二叉树或非二叉树)。其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别。使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放的类别作为决策结果。

    不同于贝叶斯算法,决策树的构造过程不依赖领域知识,它使用属性选择度量来选择将元组最好地划分成不同的类的属性。所谓决策树的构造就是进行属性选择度量确定各个特征属性之间的拓扑结构。

    那么如何划分数据呢?各个特征的优先级是怎么排的?常用的划分数据集方法有ID3和C4.5

    (1) ID3算法

    划分数据集的最大原则就是将数据变得更加有序。熵(entropy)是描述信息不确定性(杂乱程度)的一个值。设S是当前数据下的划分,那么S的信息熵的定义如下:

     

    H(S)=−∑i=1np(xi)log2p(xi)

     

    这里,n是类别的数目,p(xi)表示选择xi类别的概率(可用类别数量除以总数量估计)。

    现在我们假设将S按属性A进行划分,则S的条件信息熵(A对S划分的期望信息)为:

     

    H(S|A)=∑j=1mp(tj)H(tj)

     

    这里,在属性A的条件下,数据被划分成m个类别(例如,属性A是体重,有轻、中、重三个选项,那么m=3),p(tj)表示类别tj(属性A中所有具有第j个特性的所有数据)的数量与S总数量的比值,H(tj)表示子类别tj的熵。

    信息增益(Information gain)是指在划分数据集之前之后信息发生的变化,其定义如下:

     

    IG(S,A)=H(S)−H(S|A)=H(S)−∑j=1mp(tj)H(tj)

     

    在ID3算法里,每一次迭代过程中会计算所有剩余属性的信息增益,然后选择具有最大增益的属性对数据集进行划分,如此迭代,直至结束。这里有一个ID3算法的实例过程

    (2) C4.5算法

    D3算法存在一个问题,就是偏向于多值属性,例如,如果存在唯一标识属性ID,则ID3会选择它作为分裂属性,这样虽然使得划分充分纯净,但这种划分对分类几乎毫无用处。ID3的后继算法C4.5使用增益率(gain ratio)的信息增益扩充,试图克服这个偏倚。严格上说C4.5是ID3的一个改进算法。

    在按照ID3的中的方法得到了信息增益后,再定义分裂信息(Split Information):

     

    SI(S,A)=−∑j=1m|tj||S|log2|tj||S|

     

    然后定义增益率(Gain Ratio):

     

    GR(S,A)=IG(S,A)SI(S,A)

     

    C4.5选择增益率为分裂属性(连续属性要用增益率离散化)。C4.5算法有如下优点:产生的分类规则易于理解,准确率较高。其缺点是:在构造树的过程中,需要对数据集进行多次的顺序扫描和排序,因而导致算法的低效。此外,C4.5只适合于能够驻留于内存的数据集,当训练集大得无法在内存容纳时程序无法运行。

    如果所有属性都作为分裂属性用光了,但有的子集还不是纯净集,即集合内的元素不属于同一类别。在这种情况下,由于没有更多信息可以使用了,一般对这些子集进行“多数表决”,即使用此子集中出现次数最多的类别作为此节点类别,然后将此节点作为叶子节点。

    在实际构造决策树时,通常要进行剪枝,这时为了处理由于数据中的噪声和离群点导致的过分拟合问题。剪枝有两种:先剪枝——在构造过程中,当某个节点满足剪枝条件,则直接停止此分支的构造;后剪枝——先构造完成完整的决策树,再通过某些条件遍历树进行剪枝。悲观错误剪枝PEP算法是一种常见的事后剪枝策略。

    三. 朴素贝叶斯(Naive Bayesian)

    贝叶斯分类是一系列分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。朴素贝叶斯算法(Naive Bayesian) 是其中应用最为广泛的分类算法之一。朴素贝叶斯分类器基于一个简单的假定:给定目标值时属性之间相互条件独立。朴素贝叶斯的基本思想是对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,哪个最大,就认为此待分类项属于哪个类别。

    首先给出条件概率的定义,P(A∥B)表示事件A在B发生下的条件概率,其公式为:

     

    P(A|B)=P(AB)P(B)

     

    贝叶斯定理用来描述两个条件概率之间的关系,贝叶斯定理公式为:

     

    P(A|B)=P(B|A)P(A)P(B)

     

    朴素贝叶斯分类算法的具体步骤如下:

    (1)设x={a1,a2,...,am}为一个待分类项,a1,a2,...,am为x的m个特征属性;

    (2)设有类别集合C={y1,y2,...,yn},即共有n个类别;

    (3)依次计算x属于各项分类的条件概率,即计算P(y1∥x),P(y2∥x),… ,P(yn∥x):

     

    P(y1|x)=P(x|y1)P(y1)P(x)=P(y1)P(x)∏i=1mP(ai|y1)

     

     

     

     

    P(yn|x)=P(x|yn)P(yn)P(x)=P(yn)P(x)∏i=1mP(ai|yn)

     

    注意,算法的下一步骤是对比这些结果的大小,由于各项分母都是P(x),所以分母不用计算。分子部分中P(yn)和P(ai∥yn)都是通过样本集统计而得,其中P(yn)的值为样本集中属于yn类的数量与样本总数量之比,P(ai∥yn)的值为yn类中满足属性ai的数量与yn类下样本总数量之比。

    这样的计算方式符合特征属性是离散值的情况,如果特征属性是连续值时,通常假定其值服从高斯分布(也称正态分布),即g(x,η,σ)=12π√σe−(x−η)22σ2,那么P(ai∥yn)的值为:

     

    P(ai|yn)=g(ai,ηyn,σyn)=12π−−√σyne−(x−ηyn)22σ2yn

     

    其中,ηyn和σyn分别为训练样本yn类别中ai特征项划分的均值和标准差。

    对于P(a∥y)=0的情况,当某个类别下某个特征项划分没有出现时,就是产生这种现象,这会令分类器质量大大降低。因此引入Laplace校准,对没类别下所有划分的计数加1,这样如果训练样本集数量充分大时,并不会对结果产生影响,也避免了乘积为0的情况。

    (4)比较(3)中所有条件概率的大小,最大的即为预测分类结果,即:

     

    P(yk|x)=max{P(y1|x),P(y2|x),...,P(yn|x)}

     

     

    x∈yk

     

    这里有一个朴素贝叶斯分类实例:检测SNS社区中不真实账号

    四. 逻辑回归(Logistic Regression)

    我们知道,线性回归就是根据已知数据集求一线性函数,使其尽可能拟合数据,让损失函数最小,常用的线性回归最优法有最小二乘法和梯度下降法。而逻辑回归是一种非线性回归模型,相比于线性回归,它多了一个sigmoid函数(或称为Logistic函数)。逻辑回归是一种分类算法,主要用于二分类问题。逻辑回归的具体步骤如下:

    (1)定义假设函数h(即hypothesis)

    Sigmoid函数的图像是一个S型,预测函数就是将sigmoid函数g(x)里的自变量x替换成了边界函数θ(x),如下:

     

    hθ(x)=g[θ(x)]=11+e−θ(x)

     

    这里hθ(x)表示结果取1的概率,因此对于输入x分类结果为类别1和类别0的概率分别为:

     

    P(y=1|x,θ)=hθ(x)

     

     

    P(y=0|x,θ)=1−hθ(x)

     

    (2)定义边界函数θ(x)

    对于二维数据,如果是预设线性线性边界,那么边界函数为:

     

    θ(x)=θ0+θ1x1+θ2x2

     

    如果是预设非线性线性边界,那么边界函数为的形式就多了,例如:

     

    θ(x)=θ0+θ1x1+θ2x2+θ3x21+θ4x22

     

    假设我们现在要解决的是识别图片中的0或1(样本库只有0和1的图片),图片大小是20*20,那么这个时候有400个特征向量,那么边界函数为:

     

    θ(x)=θ0+θ1x1+...+θ400x400

     

    (3)构造损失函数(cost function,loss function)

    损失函数的大小可以体现出边界函数的各项参数是否最优。对于线性回归,损失函数是欧式距离指标,但这样的Cost Function对于逻辑回归是不可行的,因为在逻辑回归中平方差损失函数是非凸,我们需要其他形式的Cost Function来保证逻辑回归的成本函数是凸函数。

    我们选择对数似然损失函数:

     

    Cost(hθ(x),y)={−loghθ(x), if y=1 −log(1−hθ(x)), if y=0

     

    那么逻辑回归的Cost Function可以表示为:

     

    J(θ)=1m∑i=1mCost(hθ(x(i)),y(i)) =−1m∑i=1m[y(i)loghθ(x(i))+(1−y(i))log(1−hθ(x(i)))]

     

    这里m表示有m个样本,y是二值型数据,只能0或1,代表两种不同的类别。

    (4)求最优θ

    要想找到最合适的边界函数参数,只要使J(θ)最小即可。最优化的表达式为:

     

    θ=argminθJ(θ)

     

    与线性回归相似,可以采用梯度下降法寻优,也可以采用其他方法。

     

    展开全文
  • Seaborn常见绘图总结

    万次阅读 多人点赞 2019-01-24 15:52:55
    听“他们”说matplotlib中的seaborn绘图很好看而且实用,所以,这里系统的总结一下seaborn常见的图形绘制。其目的也是很简单的啦,方便我自己查看(英文很菜,每次都查单词……)。 差点忘了,这里使用的数据还是...

    以前粗略的学习过Matplotlib绘图、Pandas绘图(这里是pandas的常见绘图总结),但是都未深入的去学习过,一遇到问题就翻文档,效率低下。听“他们”说matplotlib中的seaborn绘图很好看而且实用,所以,这里系统的总结一下seaborn常见的图形绘制。其目的也是很简单,方便自己和给大家提供一些帮助(由于英文很菜,每次都查单词,有些词汇就翻译的很生硬,还请谅解……)。

    差点忘了,这里使用的数据还是seaborn的默认数据,很多人再看seaborn的时候对数据一头雾水,这里我将存放数据的GitHub放在这儿,理解数据的含义,对分析问题往往起着事半功倍的效果。

    https://github.com/mwaskom/seaborn-data

    根据Seaborn的API,具体如下:

    正文

    1.Relational plots(关系图)

    Seaborn中介绍的第一种类型的图就是Relational plots(关系图),这里翻译一下官网对他的解释:“统计分析是理解数据集中变量如何相互关联以及这些关系如何依赖于其他变量的过程。可视化可能是这个过程的核心部分,因为当数据被正确地可视化时,人类视觉系统可以看到指示某种关系的趋势和模式。”
    Relational plots(关系图)中主要讨论的是三个seaborn函数。我们最常用的是relplot()。这是一个图形级函数使用两种常用方法可视化统计关系:散点图(scatter plots)和线图(line plots)。

     1. scatterplot() (与kind="scatter";默认值)
     2. lineplot() (与kind="line")
    

    还是第一步,导入我们需要的各种模块:

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    sns.set(style="darkgrid") #这是seaborn默认的风格
    

    1.1 scatterplot(散点图)

    散点图是统计可视化的重要组成部分。它使用点云来描述两个变量的联合分布,其中每个点代表数据集中的一个观察。这种描绘可以推断出大量关于它们之间是否有任何有意义的关系的信息。
    在seaborn中有几种(后面介绍)绘制散点图的方法,当两个变量都是数字时,应该使用的最基本的是scatterplot()功能。在Categorical plots(分类图)中,我们将看到使用散点图可视化分类数据的专门工具。

    #scatterplot参数
    seaborn.scatterplot(x=None, y=None, hue=None, style=None, size=None, 
    data=None, palette=None, hue_order=None, hue_norm=None, sizes=None, 
    size_order=None, size_norm=None, markers=True, style_order=None,
     x_bins=None, y_bins=None, units=None, estimator=None, ci=95, n_boot=1000, 
     alpha='auto', x_jitter=None, y_jitter=None, legend='brief', ax=None, **kwargs)
    

    在所有的seaborn绘图时,里面的参数是众多的,但是不用担心,大部分参数是相同的,只有少部分存在差异,有些通过对单词的理解就可知道其含义,这里我只根据每个具体的图形重要的参数做一些解释,并简单的介绍这些常用参数的含义。

    • x,y:容易理解就是你需要传入的数据,一般为dataframe中的列;
    • hue:也是具体的某一可以用做分类的列,作用是分类;
    • data:是你的数据集,可要可不要,一般都是dataframe;
    • style:绘图的风格(后面单独介绍);
    • size:绘图的大小(后面介绍);
    • palette:调色板(后面单独介绍);
    • markers:绘图的形状(后面介绍);
    • ci:允许的误差范围(空值误差的百分比,0-100之间),可为‘sd’,则采用标准差(默认95);
    • n_boot(int):计算置信区间要使用的迭代次数;
    • alpha:透明度;
    • x_jitter,y_jitter:设置点的抖动程度。

    先来个简单的散点图,绘制看看效果

    #数据来源可在seaborn的GitHub上查找
    tips = sns.load_dataset("tips")
    ax = sns.scatterplot(x="total_bill", y="tip", data=tips)
    

    在这里插入图片描述
    接下来,复杂一点,按另一个变量分组(hue参数起了作用),不同类型的方式(style),点的大小(size),并显示具有不同颜色的组:

    ax = sns.scatterplot(x="total_bill", y="tip",hue="day",
     style="time",size='size',data=tips)
    

    在这里插入图片描述
    是不是复杂的多,当然还有很多参数可以改,这里就不一一介绍了,接下来看lineplot。

    1.2 lineplot(线图)

    seaborn.lineplot(x=None, y=None, hue=None, size=None, style=None,
     data=None, palette=None, hue_order=None, hue_norm=None, sizes=None,
      size_order=None, size_norm=None, dashes=True, markers=None, 
      style_order=None, units=None, estimator='mean', ci=95, n_boot=1000, 
      sort=True, err_style='band', err_kws=None, legend='brief', ax=None, **kwargs)
    

    可以看出,参数并没有较散点图有较大的改变,所以话不多说,直接上图:

    还是下来个简单的:

    fmri = sns.load_dataset("fmri")
    ax = sns.lineplot(x="timepoint", y="signal", data=fmri)
    
    #阴影是默认的置信区间,可设置ci=0,将其去除
    

    阴影是默认的置信区间,可设置ci=0,将其去除
    接下来,来个复杂一点儿的:

    #使用标记而不是破折号来识别组
    ax = sns.lineplot(x="timepoint", y="signal",hue="event", style="event",
    markers=True, dashes=False, data=fmri)
    

    在这里插入图片描述

    1.3 relplot(关系图)

    seaborn.relplot(x=None, y=None, hue=None, size=None, style=None, 
    data=None, row=None, col=None, col_wrap=None, row_order=None, 
    col_order=None, palette=None, hue_order=None, hue_norm=None, 
    sizes=None, size_order=None, size_norm=None, markers=None, dashes=None,
     style_order=None, legend='brief', kind='scatter', height=5, aspect=1,
      facet_kws=None, **kwargs)
    

    relplot(关系图)可以看做是lineplot和scatterplot的归约,可以通过kind参数来指定画什么图形,重要参数解释如下:

    • kind:默认scatter(散点图),也可以选择kind=‘line’(线图);
    • sizes:List、dict或tuple,可选,简单点就是图片大小,注意和size区分;
    • col、row:将决定网格的面数的分类变量,具体看实例;
    tips = sns.load_dataset("tips")
    g = sns.relplot(x="total_bill", y="tip", data=tips)
    #两者效果一模一样
    ax = sns.scatterplot(x="total_bill", y="tip", data=tips)
    

    在这里插入图片描述
    其他参数设置:

    g = sns.relplot(x="total_bill", y="tip", hue="time", size="size",
    palette=["b", "r"], sizes=(10, 100),col="time",row='sex', data=tips)
    

    在这里插入图片描述
    关于kind=‘line’,这里就不画了,重点是理解参数的意义。

    2.Categorical plots(分类图)

    Categorical plots(分类图)可以具体分为下面三种类型,8个小图:

    1. Categorical scatterplots(分类散点图)
      stripplot(分布散点图)
      swarmplot(分布密度散点图)
    2. Categorical distribution plots(分类分布图)
      boxplot(箱线图)
      violinplot(小提琴图)
      boxenplot(字母价值图???)
    3. Categorical estimate plots(分类估计图)
      pointplot(点图)
      barplot(条形图)
      countplot(计数统计图)

    2.1 Categorical scatterplots(分类散点图)

    2.1.1 stripplot(分布散点图)

    stripplot(分布散点图)的意思就是按照不同类别对样本数据进行分布散点图绘制。stripplot(分布散点图)一般并不单独绘制,它常常与boxplot和violinplot联合起来绘制,作为这两种图的补充。

    seaborn.stripplot(x=None, y=None, hue=None, data=None, order=None, 
    hue_order=None, jitter=True, dodge=False, orient=None, color=None, 
    palette=None, size=5, edgecolor='gray', linewidth=0, ax=None, **kwargs)
    
    • x,y,data:输入数据可以多种格式传递,在大多数情况下,使用Numpy或Python对象是可能的,但是更可取的是pandas对象,因为相关的名称将用于对轴进行注释。此外,还可以对分组变量使用分类类型来控制情节元素的顺序。
    • order:用order参数进行筛选分类类别,例如:order=[‘sun’,‘sat’];
    • jitter:抖动项,表示抖动程度,可以使float,或者True;
    • dodge:重叠区域是否分开,当使用hue时,将其设置为True,将沿着分类轴将不同色调级别的条带分开。
    • orient:“v” | “h”,vertical(垂直) 和 horizontal(水平)的意思;

    基本的图

    tips = sns.load_dataset("tips")
    ax = sns.stripplot(x="day", y="total_bill", data=tips)
    

    在这里插入图片描述
    多增加几个参数的修改:

    ax = sns.stripplot(x="day", y="total_bill", hue="smoker",data=tips, 
    jitter=True,palette="Set2", dodge=True)
    

    在这里插入图片描述

    2.1.2 swarmplot(分布密度散点图)

    这个函数类似于stripplot(),但是对点进行了调整(只沿着分类轴),这样它们就不会重叠。这更好地表示了值的分布,但它不能很好地扩展到大量的观测。

    seaborn.swarmplot(x=None, y=None, hue=None, data=None, order=None,
     hue_order=None, dodge=False, orient=None, color=None, palette=None, size=5, 
     edgecolor='gray', linewidth=0, ax=None, **kwargs)
    

    可以看出,swarmplot和stripplot参数上基本一致,少了jitter,因为它显示的是分布密度,不需要添加抖动项。

    ax = sns.swarmplot(x="day", y="total_bill", data=tips)
    

    在这里插入图片描述
    多增加几个参数的修改:

    ax = sns.swarmplot(x="day", y="total_bill", hue="smoker",data=tips,palette="Set2", dodge=True)
    

    在这里插入图片描述

    2.2 Categorical distribution plots(分类分布图)

    2.2.1 boxplot(箱线图)

    boxplot(箱线图,又称为盒须图、盒式图)便于在变量之间或跨类别变量级别比较的方式,显示定量数据的分布情况。框显示数据集的四分位数,线显示分布的其余部分,它能显示出一组数据的最大值、最小值、中位数及上下四分位数,使用四分位数范围函数的方法可以确定“离群值”的点。具体用法如下:

    seaborn.boxplot(x=None, y=None, hue=None, data=None, order=None, 
    hue_order=None, orient=None, color=None, palette=None, saturation=0.75, 
    width=0.8, dodge=True, fliersize=5, linewidth=None, whis=1.5, notch=False, ax=None, **kwargs)
    
    • saturation:饱和度,可设置为1;
    • width:float,控制箱型图的宽度大小;
    • fliersize:float,用于指示离群值观察的标记大小;
    • whis:可理解为异常值的上限IQR比例;
    • notch:我也不知道……
    ax = sns.boxplot(x="day", y="total_bill", data=tips)
    

    在这里插入图片描述

    #这些参数不一定要加,简单最好,这里只是为了展示参数的含义
    ax = sns.boxplot(x="day", y="total_bill", hue="time",data=tips, 
                     linewidth=0.5,saturation=1,width=1,fliersize=3)
    

    在这里插入图片描述

    2.2.2 violinplot(小提琴图)

    violinplot与boxplot扮演类似的角色,箱线图展示了分位数的位置,它显示了定量数据在一个(或多个)分类变量的多个层次上的分布,这些分布可以进行比较。不像箱形图中所有绘图组件都对应于实际数据点,小提琴绘图以基础分布的核密度估计为特征,通过小提琴图可以知道哪些位置的密度较高。在图中,白点是中位数,黑色盒型的范围是下四分位点到上四分位点,细黑线表示须。外部形状即为核密度估计。
    这是一种可以同时显示多个数据分布的有效和有吸引力的方法,但请记住,估计过程受样本大小的影响,相对较小的样本的小提琴手看起来可能会显得非常平滑。具体用法如下:

    seaborn.violinplot(x=None, y=None, hue=None, data=None, order=None, 
    hue_order=None, bw='scott', cut=2, scale='area', scale_hue=True, gridsize=100, 
    width=0.8, inner='box', split=False, dodge=True, orient=None, linewidth=None, 
    color=None, palette=None, saturation=0.75, ax=None, **kwargs)
    
    • bw:‘scott’, ‘silverman’, float,控制拟合程度。在计算内核带宽时,可以引用规则的名称(‘scott’, ‘silverman’)或者使用比例(float)。实际内核大小将通过将比例乘以每个bin内数据的标准差来确定;
    • cut:空值外壳的延伸超过极值点的密度,float;
    • scale:“area”, “count”, “width”,用来缩放每把小提琴的宽度的方法;
    • scale_hue:当使用hue分类后,设置为True时,此参数确定是否在主分组变量进行缩放;
    • gridsize:设置小提琴图的平滑度,越高越平滑;
    • inner:“box”, “quartile”, “point”, “stick”, None,小提琴内部数据点的表示。分别表示:箱子,四分位,点,数据线和不表示;
    • split:是否拆分,当设置为True时,绘制经hue分类的每个级别画出一半的小提琴;
    ax = sns.violinplot(x="day", y="total_bill", data=tips)
    

    在这里插入图片描述
    设置按性别分类,调色为“Set2”,分割,以计数的方式,不表示内部。

    ax = sns.violinplot(x="day", y="total_bill", hue="sex",data=tips, 
    palette="Set2", split=True,scale="count", inner=None)
    

    在这里插入图片描述

    2.2.3 violinplot+stripplot(小提琴图+分布散点图)

    ax = sns.violinplot(x="tip", y="day", data=tips, inner=None,whis=np.inf)
    ax = sns.stripplot(x="tip", y="day", data=tips,jitter=True, color="c")
    

    在这里插入图片描述

    2.2.4 violinplot+swarmplot(小提琴图+分布密度散点图)

    ax = sns.violinplot(x="tip", y="day", data=tips,inner=None, whis=np.inf)
    ax = sns.swarmplot(x="tip", y="day", data=tips, color="c")
    

    在这里插入图片描述

    2.2.5 boxplot+stripplot(箱线图+分布散点图)

    ax = sns.boxplot(x="tip", y="day", data=tips, whis=np.inf)
    ax = sns.stripplot(x="tip", y="day", data=tips,jitter=True, color="c")
    

    在这里插入图片描述

    2.2.6 boxplot+swarmplot(箱线图+分布密度散点图)

    ax = sns.boxplot(x="tip", y="day", data=tips, whis=np.inf)
    ax = sns.swarmplot(x="tip", y="day", data=tips, color="c")
    

    在这里插入图片描述

    2.3 Categorical estimate plots(分类估计图)

    2.3.1 barplot(条形图)

    条形图表示数值变量与每个矩形高度的中心趋势的估计值,用矩形条表示点估计和置信区间,并使用误差线提供关于该估计值附近的不确定性的一些指示。具体用法如下:

    seaborn.barplot(x=None, y=None, hue=None, data=None, order=None, hue_order=None, 
    estimator=<function mean>, ci=95, n_boot=1000, units=None, orient=None, 
    color=None, palette=None, saturation=0.75, errcolor='.26', errwidth=None,
    capsize=None, dodge=True, ax=None, **kwargs)
    
    • estimator:用于估计每个分类箱内的统计函数,默认为mean。当然你也可以设置estimator=np.median/np.std/np.var……
    • order:选择和空值顺序,例如:order=[‘Sat’,‘Sun’];
    • ci:允许的误差的范围(控制误差棒的百分比,在0-100之间),若填写"sd",则用标准误差(默认为95),也可设置ci=None;
    • capsize:设置误差棒帽条(上下两根横线)的宽度,float;
    • saturation:饱和度;
    • errcolor:表示置信区间的线条的颜色;
    • errwidth:float,设置误差条线(和帽)的厚度。

    根据性别分组:

    ax = sns.barplot(x="day", y="total_bill", hue="sex", data=tips)
    

    在这里插入图片描述
    设置estimator为中位数(numpy的统计函数都可以,只要你觉得有意义),设置误差棒的宽度,误差棒的颜色为“c”。

    ax = sns.barplot(x="day", y="total_bill",hue='sex', data=tips, 
    estimator=np.median,capsize=0.2,errcolor='c')
    

    在这里插入图片描述

    2.3.2 countplot(计数图)

    一个计数图可以被认为是一个分类直方图,而不是定量的变量。基本的api和选项与barplot()相同,因此您可以比较嵌套变量中的计数。(工作原理就是对输入的数据分类,条形图显示各个分类的数量)。具体参数如下:

    seaborn.countplot(x=None, y=None, hue=None, data=None, order=None, 
    hue_order=None, orient=None, color=None, palette=None, saturation=0.75, 
    dodge=True, ax=None, **kwargs)
    

    这里参数并没有太多改变,orient就是改变方向。但是,值得注意的是缺少了一些参数,而且countplot中不能同时输入x和y,却可以使用hue(这我就很纳闷了???还望大佬解释解释)。

    titanic = sns.load_dataset("titanic")
    ax = sns.countplot(x="class", hue="who", data=titanic)
    

    在这里插入图片描述

    2.3.3 piontplot(点图)

    用散点图符号表示点估计和置信区间,点图代表散点图位置的数值变量的中心趋势估计,并使用误差线提供关于该估计的不确定性的一些指示。点图可能比条形图(barplot)更有用于聚焦一个或多个分类变量的不同级别之间的比较。他们尤其善于表现交互作用:一个分类变量的层次之间的关系如何在第二个分类变量的层次之间变化。连接来自相同色调等级的每个点的线允许交互作用通过斜率的差异进行判断,这比对几组点或条的高度比较容易。具体用法如下:

    seaborn.pointplot(x=None, y=None, hue=None, data=None, order=None, 
    hue_order=None, estimator=<function mean>, ci=95, n_boot=1000, 
    units=None, markers='o', linestyles='-', dodge=False, join=True, 
    scale=1, orient=None, color=None, palette=None, errwidth=None, 
    capsize=None, ax=None, **kwargs)
    
    • join:默认两个均值点会相连接,若不想显示,可以通过join=False参数实现;
    • scale:float,均值点(默认)和连线的大小和粗细。
    tips = sns.load_dataset("tips")
    ax = sns.pointplot(x="time", y="total_bill", data=tips)
    

    在这里插入图片描述
    尝试更多参数,按性别分组,用中位数进行比较,分开显示,使用调色板,修改标记类型和线条类型(很多参数都不是必要的,这里只是尽量充分介绍其用法)。

    ax = sns.pointplot(x="time", y="total_bill", hue="smoker",data=tips,estimator=np.median,
    dodge=True, palette="Set2",markers=["o", "x"],linestyles=["-", "--"])
    

    在这里插入图片描述

    2.3.4 catplot()

    该函数提供了对几个轴级函数的访问,这些函数使用几种可视化表示形式之一显示一个数字变量和一个或多个分类变量之间的关系。其实说白了就是利用kind参数来画前面Categorical plots(分类图)中的任意8个图形。具体如下:

    seaborn.catplot(x=None, y=None, hue=None, data=None, row=None, col=None, 
    col_wrap=None, estimator=<function mean>, ci=95, n_boot=1000, units=None, 
    order=None, hue_order=None, row_order=None, col_order=None, kind='strip',
     height=5, aspect=1, orient=None, color=None, palette=None, legend=True, 
     legend_out=True, sharex=True, sharey=True, margin_titles=False, 
     facet_kws=None, **kwargs)
    

    有没有发现,它和regplot(关系图)的使用方法差不多?

    • kind:默认strip(分布散点图),也可以选择“point”, “bar”, “count”,
    • col、row:将决定网格的面数的分类变量,可具体制定;
    • col_wrap:指定每行展示的子图个数,但是与row不兼容;
    • row_order, col_order : 字符串列表,安排行和列,以及推断数据中的对象;
    • height,aspect:与图像的大小有关;
    • sharex,sharey:bool, ‘col’or ‘row’,是否共享想,x,y坐标;

    注:单个图形里面的参数也是可以传入里面的

    绘制一个小提琴图,按数据中的kind类别分组(数据中的),不要中心框线。

    exercise = sns.load_dataset("exercise")
    g = sns.catplot(x="time", y="pulse", hue="kind",data=exercise, kind="violin",inner=None)
    

    在这里插入图片描述
    使用diet来分成几个图形,并用height、aspect来设置图片比例:

    g = sns.catplot(x="time", y="pulse", hue="kind",kind='bar',col="diet", 
    data=exercise,height=4, aspect=0.8)
    

    在这里插入图片描述

    3 Distribution plots(分布图)

    3.1 distplot(直方图)

    直方图又称质量分布图,它是表示资料变化情况的一种主要工具。用直方图可以解析出资料的规则性,比较直观地看出产品质量特性的分布状态,对于资料分布状况一目了然,便于判断其总体质量分布情况。直方图表示通过沿数据范围形成分箱(好像是等距分箱?),然后绘制条以显示落入每个分箱的观测次数的数据分布。具体参数如下:

    seaborn.distplot(a, bins=None, hist=True, kde=True, rug=False, fit=None, 
    hist_kws=None, kde_kws=None, rug_kws=None, fit_kws=None, color=None,
     vertical=False, norm_hist=False, axlabel=None, label=None, ax=None)
    
    • bins:int或list,控制直方图的划分,设置矩形图(就是块儿的多少)数量,除特殊要求一般默认;
    • hist:是否显示方块;
    • kde:是否显示核密度估计曲线;
    • rug:控制是否生成观测数值的小细条(边际毛毯);
    • fit:控制拟合的参数分布图形,能够直观地评估它与观察数据的对应关系(黑色线条为确定的分布);
      -{hist, kde, rug, fit}_kws :参数接收字典类型,可以自行定义更多高级的样式;
    • norm_hist:若为True, 则直方图高度显示密度而非计数(含有kde图像中默认为True);
    • vertical:放置的方向,如果为真,则观测值位于y-轴上(默认False,x轴上);
    • axlabel : string, False, or None, 设置标签。

    设置随机种子(666),随机生成1000个符合正态分布的数:

    np.random.seed(666)
    x = np.random.randn(1000)
    ax = sns.distplot(x)
    

    在这里插入图片描述
    修改更多参数,设置方块的数量,方块、密度曲线和边际毛毯都显示,颜色为‘k’,axlabel=‘norm’。

    np.random.seed(666)
    x = np.random.randn(1000)
    ax = sns.distplot(x, bins=100,hist=True, kde=True, rug=True,color='k',axlabel='norm')
    

    在这里插入图片描述

    3.2 kdeplot(核密度图)

    核密度估计(kernel density estimation)是在概率论中用来估计未知的密度函数,属于非参数检验方法之一。通过核密度估计图可以比较直观的看出数据样本本身的分布特征。具体用法如下:

    seaborn.kdeplot(data, data2=None, shade=False, vertical=False, kernel='gau', 
    bw='scott', gridsize=100, cut=3, clip=None, legend=True, cumulative=False, 
    shade_lowest=True, cbar=False, cbar_ax=None, cbar_kws=None, ax=None, **kwargs)
    
    • data、data2:表示可以输入双变量,绘制双变量核密度图;
    • shade:是否填充阴影,默认不填充;
    • vertical:放置的方向,如果为真,则观测值位于y轴上(默认False,x轴上);
    • kernel:{‘gau’ | ‘cos’ | ‘biw’ | ‘epa’ | ‘tri’ | ‘triw’ }。默认高斯核(‘gau’)二元KDE只能使用高斯核。至于什么是核函数,这个学问就大了,建议多看看论文;
    • bw:{‘scott’ | ‘silverman’ | scalar | pair of scalars }。四类核密度带方法,默认scott (斯考特带宽法),建议下来了解一下这四种方法的区别;
    • gridsize:这个参数指的是每个格网里面,应该包含多少个点,越大,表示格网里面的点越多(觉得电脑OK的可以试试,有惊喜),越小表示格网里面的点越少;
    • cut:参数表示,绘制的时候,切除带宽往数轴极限数值的多少,这个参数可以配合bw参数使用;
    • cumulative:是否绘制累积分布;
    • shade_lowest:是否有最低值渲染,这个参数只有在二维密度图上才有效;
    • clip:表示查看部分结果,是一个区间;
    • cbar:参数若为True,则会添加一个颜色棒(颜色帮在二元kde图像中才有);

    有木有觉得参数超多,所以说核密度图还是比较难的(虽然容易画,但原理很复杂)。下面看几个简单的例子:简单生成一个多元正态分布(对numpy随机分布不了解的朋友,可以看我总结的numpy函数)。

    mean, cov = [0, 2], [(1, .5), (.5, 1)]
    #这是一个多元正态分布
    x, y = np.random.multivariate_normal(mean, cov, size=50).T
    ax = sns.kdeplot(x)
    

    在这里插入图片描述
    接下来绘制双变量核密度图①:

    ax=sns.kdeplot(x,y,shade=True,shade_lowest=False,cbar=True,color='r')
    

    在这里插入图片描述
    接下来绘制双变量核密度图②:二色二元密度图,使用大名鼎鼎的鸢尾花数据集

    iris = sns.load_dataset("iris")
    setosa = iris.loc[iris.species == "setosa"]
    virginica = iris.loc[iris.species == "virginica"]
    ax = sns.kdeplot(setosa.sepal_width, setosa.sepal_length,cmap="Reds",
     shade=True, shade_lowest=False)
    ax = sns.kdeplot(virginica.sepal_width, virginica.sepal_length,cmap="Blues", 
    shade=True, shade_lowest=False)
    

    在这里插入图片描述

    3.3 jointplot(联合分布图)

    联合概率分布简称联合分布,是两个及以上随机变量组成的随机向量的概率分布。根据随机变量的不同,联合概率分布的表示形式也不同。对于离散型随机变量,联合概率分布可以以列表的形式表示,也可以以函数的形式表示;对于连续型随机变量,联合概率分布通过一非负函数的积分表示。具体参数如下:

    seaborn.jointplot(x, y, data=None, kind='scatter', stat_func=None, color=None, 
    height=6, ratio=5, space=0.2, dropna=True, xlim=None, ylim=None, joint_kws=None,
     marginal_kws=None, annot_kws=None, **kwargs)
    
    • x,y:为DataFrame中的列名或者是两组数据,data指向dataframe;
    • kind : { “scatter” | “reg” | “resid” | “kde” | “hex” }。默认散点图;
    • stat_func:用于计算统计量关系的函数;
    • ratio:中心图与侧边图的比例,越大、中心图占比越大;
    • dropna:去除缺失值;
    • height:图的尺度大小(正方形);
    • space:中心图与侧边图的间隔大小;
    • xlim,ylim:x,y的范围

    用边缘直方图绘制散点图:

    tips = sns.load_dataset("tips")
    g = sns.jointplot(x="total_bill", y="tip", data=tips,height=5)
    

    在这里插入图片描述
    #用密度估计替换散点图和直方图,调节间隔和比例:

    iris = sns.load_dataset("iris")
    g = sns.jointplot("sepal_width", "petal_length", data=iris,kind="kde", space=0,ratio=6 ,color="r")
    

    在这里插入图片描述

    3.4 pairplot(变量关系组图)

    在数据集中绘制成对关系的图。默认情况下,该函数将创建一个轴网格,这样数据中的每个变量都将通过跨一行的y轴和跨单个列的x轴共享。对对角线轴的处理方式不同,绘制的图显示该列中变量的数据的单变量分布。此外,还可以在行和列上显示变量子集或绘制不同的变量。具体如下:

    seaborn.pairplot(data, hue=None, hue_order=None, palette=None, vars=None, 
    x_vars=None, y_vars=None, kind='scatter', diag_kind='auto', markers=None,
     height=2.5, aspect=1, dropna=True, plot_kws=None, diag_kws=None, 
     grid_kws=None, size=None)
    
    • var:data中的子集,否则使用data中的每一列;
    • x_vars / y_vars:可以具体细分,谁与谁比较;
    • kind:{‘scatter’, ‘reg’};
    • diag_kind:{‘auto’, ‘hist’, ‘kde’}。单变量图(自己与自己比较)的绘图,对角线子图的图样。默认情况取决于是否使用“hue”。

    采用默认格式绘制鸢尾花数据集,这样对于分类问题来说并不能有效的观察数据情况。

    iris = sns.load_dataset("iris")
    g = sns.pairplot(iris)
    

    在这里插入图片描述
    使用hue="species"对不同种类区分颜色绘制,并使用不同标记:

    g = sns.pairplot(iris, hue="species", markers=["o", "s", "D"])
    

    在这里插入图片描述

    4 Regression plots(回归图)

    4.1 lmplot(回归图)

    许多数据集都有着众多连续变量。数据分析的目的经常就是衡量变量之间的关系,lmplot() 是一个非常有用的方法,它会在绘制二维散点图时,自动完成回归拟合。具体参数如下:

    seaborn.lmplot(x, y, data, hue=None, col=None, row=None, palette=None, 
    col_wrap=None, height=5, aspect=1, markers='o', sharex=True, sharey=True, 
    hue_order=None, col_order=None, row_order=None, legend=True, legend_out=True, 
    x_estimator=None, x_bins=None, x_ci='ci', scatter=True, fit_reg=True, ci=95, 
    n_boot=1000, units=None, order=1, logistic=False, lowess=False, robust=False, 
    logx=False, x_partial=None, y_partial=None, truncate=False, x_jitter=None, 
    y_jitter=None, scatter_kws=None, line_kws=None, size=None)
    
    • col,row:和前面一样,根据所指定属性在列,行上分类;
    • col_wrap:指定每行的列数,最多等于col参数所对应的不同类别的数量;
    • aspect:控制图的长宽比;
    • x_jitter,y_jitter:给x,y轴随机增加噪音点,设置这两个参数不影响最后的回归直线;
    • order:多项式回归,控制进行回归的幂次,设定指数,可以用多项式拟合;
    • logistic:逻辑回归;
    • robust:如果是True,使用statsmodels来估计一个稳健的回归(鲁棒线性模型)。这将减少异常值。请注意 logistic回归和robust回归相较于简单线性回归需要更大的计算量,其置信区间的产生也依赖于bootstrap采样,你可以关掉置信区间估计来提高速度(ci=None);
      • lowess:如果是True,使用statsmodels来估计一个非参数的模型(局部加权线性回归)。这种方法具有最少的假设,尽管它是计算密集型的,但目前无法为这类模型绘制置信区间;
    • logx:转化为log(x)
    • truncate:默认情况下,绘制散点图后绘制回归线以填充x轴限制。如果为True,则它将被数据限制所限制;
      绘制一个第三个变量的条件,并绘制不同颜色的回归图:
    g = sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips)
    

    在这里插入图片描述

    将变量分为多行,并改变大小:

    g = sns.lmplot(x="total_bill", y="tip", col="day", hue="day",data=tips,
     col_wrap=2, height=4)
    

    在这里插入图片描述

    4.2 regplot()

    regplot()和lmplot()都可以绘制线性回归曲线。这两个函数非常相似,甚至共有一些核心功能。具体参数如下:

    seaborn.regplot(x, y, data=None, x_estimator=None, x_bins=None, x_ci='ci', 
    scatter=True, fit_reg=True, ci=95, n_boot=1000, units=None, order=1, logistic=False, 
    lowess=False, robust=False, logx=False, x_partial=None, y_partial=None, 
    truncate=False, dropna=True, x_jitter=None, y_jitter=None, label=None, color=None, 
    marker='o', scatter_kws=None, line_kws=None, ax=None)
    

    至于两者有什么具体的区别,我也不清楚,但是感觉lmplot()要比regplot()强大一点……以后再总结吧,还是继续绘图。

    g = sns.regplot(x="total_bill", y="tip",data=tips)
    

    在这里插入图片描述
    尝试逻辑回归分类:

    tips["big_tip"] = (tips.tip / tips.total_bill) > .175
    ax = sns.regplot(x="total_bill", y="big_tip", data=tips,logistic=True, n_boot=500, y_jitter=.03)
    

    在这里插入图片描述

    5.Matrix plots(矩阵图)

    5.1 heatmap(热力图)

    利用热力图可以看数据表里多个特征两两的相似度,类似于色彩矩阵。具体参数如下:

    seaborn.heatmap(data, vmin=None, vmax=None, cmap=None, center=None, 
    robust=False, annot=None, fmt='.2g', annot_kws=None, linewidths=0, linecolor='white', 
    cbar=True, cbar_kws=None, cbar_ax=None, square=False, xticklabels='auto', 
    yticklabels='auto', mask=None, ax=None, **kwargs)
    
    • data:矩阵数据集,可以使numpy的数组(array),如果是pandas的dataframe,则df的index/column信息会分别对应到heatmap的columns和rows;
    • vmax,vmin:图例中最大值和最小值的显示值,没有该参数时默认不显示;
    • cmap:从数字到色彩空间的映射,取值是matplotlib包里的colormap名称或颜色对象,或者表示颜色的列表;
    • center:数据表取值有差异时,设置热力图的色彩中心对齐值。通过设置center值,可以调整生成的图像颜色的整体深浅;设置center数据时,如果有数据溢出,则手动设置的vmax、vmin会自动改变 ;
    • robust:默认取值False;如果是False,且没设定vmin和vmax的值,热力图的颜色映射范围根据具有鲁棒性的分位数设定,而不是用极值设定;
    • annot(annotate的缩写):默认取值False;如果是True,在热力图每个方格写入数据;如果是矩阵,在热力图每个方格写入该矩阵对应位置数据;
    • fmt:字符串格式代码,矩阵上标识数字的数据格式,比如保留小数点后几位数字;
    • annot_kws:默认取值False;如果是True,设置热力图矩阵上数字的大小颜色字体;
    • square:设置热力图矩阵小块形状,默认值是False;
    • xticklabels, yticklabels:控制每行列标签名的输出。默认值是auto,自动选择标签的标注间距,将标签名不重叠的部分(或全部)输出。如果是True,则以DataFrame的列名作为标签名;
    • mask:控制某个矩阵块是否显示出来。默认值是None。如果是布尔型的DataFrame,则将DataFrame里True的位置用白色覆盖掉。

    绘制一个简单的numpy数组的热力图:

    x = np.random.rand(10, 12)
    ax = sns.heatmap(x)
    

    在这里插入图片描述
    显示数字和保留几位小数,并修改数字大小字体颜色格式:

    x= np.random.rand(10, 10)
    ax = sns.heatmap(x,annot=True,annot_kws={'size':9,'weight':'bold', 'color':'w'},fmt='.2f')
    

    在这里插入图片描述

    5.2 clustermap(聚类图)

    clustermap() 可以将矩阵数据集绘制为层次聚类热图。具体参数如下:

    seaborn.clustermap(data, pivot_kws=None, method='average', metric='euclidean', 
    z_score=None, standard_scale=None, figsize=None, cbar_kws=None, row_cluster=True, 
    col_cluster=True, row_linkage=None, col_linkage=None, row_colors=None, col_colors=None, 
    mask=None, **kwargs)
    

    说实在的这个我也不太懂,就抛砖引玉的画一下图。

    iris = sns.load_dataset("iris")
    species = iris.pop("species")
    g = sns.clustermap(iris)
    

    在这里插入图片描述

    6 FacetGrid()

    在探索中多维数据时,一种有用的方法是在数据集的不同子集上绘制同一类型图的多个子图。该类将数据集映射到与数据集中变量级别相对应的行和列网格中排列的多个轴上。它生成的图形通常被称为“格子”或“格子”绘图,它可以使查看者快速观察到有关复杂数据的大量信息。

    FacetGrid当您想要在数据集的子集中分别可视化变量的分布或多个变量之间的关系时,该类非常有用。一个FacetGrid可以与多达三个维度可以得出:row,col,和hue。前两个与得到的轴阵列有明显的对应关系; 将hue变量视为沿深度轴的第三个维度,其中不同的级别用不同的颜色绘制。通过使用FacetGrid数据框初始化对象以及将形成网格的行,列或hue维度的变量名称来使用该类。这些变量(hue)应该是分类的或离散的,然后变量的每个级别的数据将用于沿该轴的小平面。此外,每个的relplot(),catplot()以及lmplot()在内部使用这些对象。

    在大多数情况下,与直接使用FacetGrid相比,使用图形级函数(例如relplot()或catart()要好得多。具体参数如下:

    seaborn.FacetGrid(data, row=None, col=None, hue=None, col_wrap=None, 
    sharex=True, sharey=True, height=3, aspect=1, palette=None, 
    row_order=None, col_order=None, hue_order=None, hue_kws=None, 
    dropna=True, legend_out=True, despine=True, margin_titles=False, 
    xlim=None, ylim=None, subplot_kws=None, gridspec_kws=None, size=None)
    

    其实细心的您可能已经发现某些具有相同的规律,不妨看看前面relplot()、catplot()、lmplot()的参数,是不是基本上差不多呢?没错,其实上面三个绘图函数,都用到了FacetGrid()的思想。此外,pairplot()走某种意义上来说,也与他们很像。

    FacetGrid并不能直接绘制我们想要的图像,它的基本工作流程是FacetGrid使用数据集和用于构造网格的变量初始化对象。然后,可以通过调用FacetGrid.map()或将一个或多个绘图函数应用于每个子集 FacetGrid.map_dataframe(),最后,可以使用其他修改参数的方法调整绘图。

    下面展示具体实例:使用TIPS数据集初始化2x2个面网格:

    tips = sns.load_dataset("tips")
    g = sns.FacetGrid(tips, col="time", row="smoker")#2*2
    

    在这里插入图片描述
    然后,在每个方面上绘制一个二元函数:

    tips = sns.load_dataset("tips")
    g = sns.FacetGrid(tips, col="time", row="smoker")
    g = g.map(plt.scatter, "total_bill", "tip", color="c")
    

    在这里插入图片描述
    这里我其实有个疑问,为什么g.map()里面用的是plt.scatter等matplotlib.pyplot来绘制图形,我尝试了用seaborn里面的sns.scatterplot等也可以绘制相应的图形,区别在于点的大小形状不一样,还望各位看官指点一下其中的差别。

    接下来比较一下FacetGrid.map()绘图与relplot()、catplot()、lmplot()绘图的区别(这里只比较relplot()来绘制散点图):

    sns.relplot(x="total_bill", y="tip", color="c",col="time",  hue="smoker",data=tips)
    

    在这里插入图片描述
    看出来了吗?结果是不是很清晰,一目了然?所以说:在大多数情况下,与直接使用FacetGrid相比,使用图形级函数(例如relplot()或catart()要好得多。

    7 PairGrid()

    用于绘制数据集中成对关系的子图网格。该类将数据集中的每个变量映射到多轴网格中的列和行。不同的轴级绘图函数可用于绘制上、下三角形的二元图解,并可在对角线上显示每个变量的边缘分布。读到这里你就会发现,它和pairplot()有什么区别呢?

    其实PairGrid和pairplot从原理来说是一样的,但是前面我们可以发现pairplot绘制的图像上、下三角形是关于主对角线对称的,而PairGrid则可修改上、下三角形和主对角线的图像形状。具体事例如下:

    iris = sns.load_dataset("iris")
    g = sns.PairGrid(iris,hue="species")
    g = g.map_upper(sns.scatterplot)#在上对角线子图上用二元函数绘制的图
    g = g.map_lower(sns.kdeplot,color='r')#在下对角线子图上用二元函数绘制的图
    g = g.map_diag(sns.kdeplot)#对角线单变量子图
    

    在这里插入图片描述

    8 主题和颜色

    8.1 主题(style)

    seaborn设置风格的方法主要有三种:

    1. set,通用设置接口
    2. set_style,风格专用设置接口,设置后全局风格随之改变
    3. axes_style,设置当前图(axes级)的风格,同时返回设置后的风格系列参数,支持with关键字用法

    seaborn中主要有以下几个主题:

    sns.set_style("whitegrid")  # 白色网格背景
    sns.set_style("darkgrid")   # 灰色网格背景
    sns.set_style("dark")       # 灰色背景
    sns.set_style("white")      # 白色背景
    sns.set_style("ticks")      # 四周加边框和刻度
    

    在这里插入图片描述
    相比matplotlib绘图风格,seaborn绘制的直方图会自动增加空白间隔,图像更为清爽。而不同seaborn风格间,则主要是绘图背景色的差异。

    8.2 环境(context)

    设置环境的方法也有3种:

    1. set,通用设置接口
    2. set_context,环境设置专用接口,设置后全局绘图环境随之改变
    3. plotting_context,设置当前图(axes级)的绘图环境,同时返回设置后的环境系列参数,支持with关键字用法
    sns.plotting_context("notebook")  # 默认
    sns.plotting_context("paper")
    sns.plotting_context("talk")
    sns.plotting_context("poster")
    

    在这里插入图片描述
    可以看出,4种默认绘图环境最直观的区别在于字体大小的不同,而其他方面也均略有差异。详细对比下4种绘图环境下的系列参数设置:

    在这里插入图片描述

    8.3 颜色(color_palette())

    seaborn风格多变的另一大特色就是支持个性化的颜色配置。颜色配置的方法有多种,常用方法包括以下两个:

    1. color_palette,基于RGB原理设置颜色的接口,可接收一个调色板对象作为参数,同时可以设置颜色数量
    2. hls_palette,基于Hue(色相)、Luminance(亮度)、Saturation(饱和度)原理设置颜色的接口,除了颜色数量参数外,另外3个重要参数即是hls

    同时,为了便于查看调色板样式,seaborn还提供了一个专门绘制颜色结果的方法palplot。
    在这里插入图片描述

    补充

    Seaborn入门详细教程

    展开全文
  • 箱形(Box-plot)是统计学中一种常见统计,由于其图形与箱子类似而得名,所以又"箱线图"、"盒须"、"盒式"等名称。箱形可以统计出单变量数据的离散程度,将数据的离散程度以及分布区间清晰直观地表现出来,...
  • 学术论文模式图、统计图绘制

    千次阅读 2018-07-09 20:19:32
    其实,插图制作这项技能并非“高深莫测”,它在国外已经非常普及,我们可以看到大部分国外实验室的文章都配非常精美的插图。但是由于国内科研工作者对插图的不够重视,目前它在国内还不为绝大部分科研工作者所掌握...
  • 在图形用户界面(GUI)中屏幕上的一对象,用户可操作该对象来执行对报表的各项设计,修改等操作。 常见报表类型解析 根据报表的布局、数据源结构、打印方式和数据分析方式,可将应用系统中的报表分为以下类型: ...
  • pandas 常见绘图总结

    万次阅读 多人点赞 2019-12-26 16:25:53
    文章目录pandas 常见绘图总结前言一 设置字体和显示中文二 pandas 可视化(0.25.3版本)1 线形2 条形2.1 垂直条形2.2 水平条形3 饼图4 散点4.1 普通散点4.2 气泡5 面积6 箱线图7 直方8 核密度曲线9...
  • 常见的图像特征

    万次阅读 2019-07-05 19:45:25
    虽然现在CNN可以自己进行特征提取,但还是需要对OpenCV传统的特征提取方法一些了解 1、颜色特征 颜色特征是图像检索中应用最为广泛的视觉特征。颜色特征无需进行大量计算。只需将数字图像中的像素值进行相应...
  • 饼图(扇形) 适用情况:对多组数据的基本比例进行比较,且每组差别较大时。展示的往往是类别型数据。 图表含义:每个扇形块表示每组频数,整个圆表示多组数据的频数总和。扇形占圆的百分比表示该组占总体的百分比...
  • 将图像上雨水去除的四种主流方法

    万次阅读 2018-01-16 18:31:58
    图四:使用导向滤波进行透射率求取 基于卷积神经网络的深度去雨 首先介绍一下什么是卷积神经网络(CNN): 在深度学习的浪潮中,很多研究方向,其中卷积神经网络是图像处理和视觉领域内非常热门的...
  • matplotlib提供的所有绘图都带默认样式。虽然这可以进行快速绘图,但有时可能需要自定义绘图的颜色和样式,以对绘制更加精美、符合审美要求的图像。matplotlib的设计考虑到了此需求,很容易调整matplotlib图形的...
  • 统计直方-累加直方

    万次阅读 2014-10-16 17:13:19
    常见的直方图有统计直方,累积直方。我们将分别实验两直方在图像聚类和检索中的性能。 l 统计直方  为利用图像的特征描述图像,可借助特征的统计直方。图像特征的统计直方实际是一个1-D...
  • 概率论几种常见分布

    千次阅读 2020-02-27 21:03:31
    学习数据分析看到几种统计方法,没办法,过来总计一下吧,反正感觉我以后用的次数还多着哩。 正态分布 正态分布(normal distribution)又名高斯分布,是一个非常常见的连续概率分布。正态分布在统计学上十分重要,...
  • 当然都是些常用的配置项,如果奇怪的需求,大家自行查找。。 当然前提是必须先安装了pyecharts库 -_ -... 引用数据 本次作图的数据来自dataset中的“tips”数据集,引用的方法很多,大家可自行参考。 ...
  • 系列链接 Python-Matplotlib可视化(1)——一文详解常见统计图的绘制 Python-Matplotlib可视化(2)——自定义颜色绘制精美统计图 Python-Matplotlib可视化(3)——自定义样式绘制精美统计图 Python-Matplotlib...
  • JSON常见压缩方式

    万次阅读 2020-03-06 15:40:29
    无论使用何编程语言,json格式的数据已被广泛应用,不论是数据的传输还是存储,在很多应用场景下,你可能想进一步地压缩JSON字符串的长度,以提升传输效率,如果你使用的是nosql数据库,你可能想进一步的压缩json...
  • 这是作者网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您喜欢,...这篇文章将分享APT攻击检测溯源与常见APT组织的攻击案例,并介绍防御措施。希望文章对您有所帮助~
  • 相关文章:Redis简介以及和其他缓存数据库的区别前言Redis除了可以存储键还可以存储常见的5数据类型,分别是:String、List、Set、Hash、ZSet。对于Redis的命令一部分是可以公用的,但是还有一些其他的命令是...
  • 图像噪声的成因分类与常见图像去噪算法简介

    万次阅读 多人点赞 2018-10-17 14:01:34
    本文的内容主要介绍了常见噪声的分类与其特性。将噪声建模,然后用模型去实现各式各样的噪声。 &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; 实际生活中的各种照片的老
  • 常见的图像特征即特征匹配方法

    千次阅读 2015-09-17 15:15:51
    这部分是比较老的常见的一些基础得方法: 常用的图像特征颜色特征、纹理特征、形状特征、空间关系特征。 一 颜色特征 (一)特点:颜色特征是一全局特征,描述了图像或图像区域所对应的景物的表面性质。一般...
  • 8种常见算法比较

    万次阅读 2016-08-09 17:42:38
    8种常见机器学习算法比较 2016-08-04 17:46 转载 陈圳 0条评论 雷锋网(搜索“雷锋网”公众号关注)按:本文转自刘志伟责编,在机器学习中选择一个恰当的算法十分重要,文中主要介绍了8计算机算法...
  • 聊聊后台5种常见的几布局

    千次阅读 2019-05-20 16:51:53
    在设计中如果没有使用者需求度高的页面时,这时候放统计页面绝对是个good idea(前提是的话,连统计都没有的后台是多简陋),不然浪费了这么好的资源。 统计页面要统计什么数据呢?我认为从三个方面考虑比较...
  • 四种滤波方式

    千次阅读 2018-08-30 14:00:00
    均值滤波,是最简单的一滤波操作,输出图像的每一个像素是核窗口内输入图像对应像素的像素的平均值( 所有像素加权系数相等),其实说白了它就是归一化后的方框滤波。 下面开始讲均值滤波的内容吧。 ⑴均值滤波的...
  • 在统计学上,我们会遇到一些常见的分布,除了正态分布外,,如t检验...四种分布的讲解摘自MATLAB 2016的统计学和机器学习工具箱,兴趣的可以去查看英文原版。 另外,为了方便,上传文档为图片格式,可能有些模糊...
  • MPAndroidChart常见设置属性(一)——应用层

    万次阅读 多人点赞 2016-08-16 17:08:37
    MPAndroidChart常见设置属性(一)——应用层 MPAndroidChart项目实战(一)——实现对比性柱状 MPAndroidChart项目实战(二)——双平滑曲线(双折线)和MarkView实现 MPAndroidChart项目实战(三)——饼状...
  • 8种常见机器学习算法比较

    万次阅读 多人点赞 2016-10-26 20:35:41
    对于核的选择也是技巧的(libsvm中自带了四种核函数:线性核、多项式核、RBF以及sigmoid核): 第一,如果样本数量小于特征数,那么就没必要选择非线性核,简单的使用线性核就可以了; 第二,如果...
  • 白话空间统计二十:地理加权回归(三)

    万次阅读 多人点赞 2017-03-12 18:49:16
    如果说,空间统计有别于经典统计学的两大特征:空间相关性和空间异质性,莫兰指数等可以用来量化空间相关性,那么地理加权回归,就可以用来量化空间异质性。 在对全局回归问题的改进中,局部回归可以说是最简单的...
  • 常见图像压缩方法

    千次阅读 2004-07-29 23:04:00
    产生霍夫曼编码需要对原始数据扫描两遍,第一遍扫描要精确地统计出原始数据中的每个值出现的频率,第二遍是建立霍夫曼树并进行编码,由于需要建立二叉树并遍历二叉树生成编码,因此数据压缩和还原速度都较慢,但简单...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 103,894
精华内容 41,557
关键字:

常见的统计图有哪些四种