ECharts案例学习笔记——2020.08.28

一、案例技术目录(数据可视化)

1、使用技术

①基于 flexible.js + rem 智能大屏适配

② VScode cssrem 插件

③ Flex 布局

④ Less 使用

⑤基于 ECharts 数据可视化展示

⑥ ECharts 柱状图数据设置

⑦ ECharts 地图引入

2、ECharts基础配置

① series

—系列列表,每个系列通过 type 决定自己的图表类型。

—图标数据,指定什么类型的图标,可以多个图标重叠。

② xAxis:直角坐标系 grid 中的 x 轴

— boundaryGap:坐标轴两边留白策略 true,这时候刻度只作为分割线,标签和数据点都会在两个刻度之间的带(band)中间。

② yAxis:直角坐标系 grid 中的 y 轴

③ grid:直角坐标系内绘图网格

④ title:标题组件

⑤ tooltip:提示框组件

⑥ legend:图例组件

⑦ color:调色盘颜色列表

——数据堆叠,同个类目轴上系列配置相同的 stack 值后,后一个系列的值会在前一个系列的值上相加

二、案例演示结果

三、案例代码

1、index.html




    
    ECharts
    
    


    
    

数据可视化——ECharts

柱形图-就业行业

折线图-人员变化 2020 2021

饼形图-年龄分布

  • 12334
  • 21323
  • 前端需求人数
  • 市场供用人数

柱形图-技能掌握

折线图-播放量

饼形图-地区分布

2、index.css

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}
li {
  list-style: none;
}
/* 1rem = 80px */
/* 声明字体*/
@font-face {
  font-family: electronicFont;
  src: url(../font/DS-DIGIT.TTF);
}
body {
  background: url(../images/bg.jpg) no-repeat top center;
  line-height: 1.15;
}
header {
  position: relative;
  height: 1.25rem;
  background: url(../images/head_bg.png) no-repeat;
  background-size: 100% 100%;
}
header h1 {
  font-size: 0.475rem;
  color: #fff;
  text-align: center;
  line-height: 1rem;
}
header .showTime {
  position: absolute;
  right: 0.375rem;
  top: 0;
  line-height: 0.9375rem;
  color: rgba(255, 255, 255, 0.7);
  font-size: 0.25rem;
}
.mainbox {
  display: flex;
  min-width: 1024px;
  max-width: 1920px;
  margin: 0 auto;
  padding: 0.125rem 0.125rem 0;

}
.mainbox .column {
  flex: 3;
}
.mainbox .column:nth-child(2) {
  flex: 5;
  margin: 0 0.125rem 0.1875rem;
  overflow: hidden;
}
.mainbox .panel {
  position: relative;
  height: 3.875rem;
  padding: 0 0.1875rem 0.5rem;
  border: 1px solid rgba(25, 186, 139, 0.17);
  margin-bottom: 0.1875rem;
  background: url(../images/line.png) rgba(255, 255, 255, 0.03);
}
.mainbox .panel::before {
  position: absolute;
  top: 0;
  left: 0;
  width: 10px;
  height: 10px;
  border-left: 2px solid #02a6b5;
  border-top: 2px solid #02a6b5;
  content: "";
}
.mainbox .panel::after {
  position: absolute;
  top: 0;
  right: 0;
  width: 10px;
  height: 10px;
  border-right: 2px solid #02a6b5;
  border-top: 2px solid #02a6b5;
  content: "";
}
.mainbox .panel .panel-footer {
  position: absolute;
  bottom: 0;
  left: 0;
  width: 100%;
}
.mainbox .panel .panel-footer::before {
  position: absolute;
  left: 0;
  bottom: 0;
  width: 10px;
  height: 10px;
  border-left: 2px solid #02a6b5;
  border-bottom: 2px solid #02a6b5;
  content: "";
}
.mainbox .panel .panel-footer::after {
  position: absolute;
  bottom: 0;
  right: 0;
  width: 10px;
  height: 10px;
  border-right: 2px solid #02a6b5;
  border-bottom: 2px solid #02a6b5;
  content: "";
}
.mainbox .panel h2 {
  height: 0.6rem;
  color: #fff;
  line-height: 0.6rem;
  text-align: center;
  font-size: 0.25rem;
  font-weight: 400;
}
.mainbox .panel h2 a {
  color: #fff;
  text-decoration: none;
  margin: 0 0.125rem;
}
.mainbox .panel .chart {
  height: 3rem;
}
.no {
  background: rgba(101, 132, 226, 0.1);
  padding: 0.1875rem;
}
.no .no-hd {
  position: relative;
  border: 1px solid rgba(25, 186, 139, 0.17);
}
.no .no-hd::before {
  position: absolute;
  top: 0;
  left: 0;
  content: "";
  width: 30px;
  height: 10px;
  border-top: 2px solid #02a6b5;
  border-left: 2px solid #02a6b5;
}
.no .no-hd::after {
  position: absolute;
  bottom: 0;
  right: 0;
  content: "";
  width: 30px;
  height: 10px;
  border-right: 2px solid #02a6b5;
  border-bottom: 2px solid #02a6b5;
}
.no .no-hd ul {
  display: flex;
}
.no .no-hd ul li {
  position: relative;
  flex: 1;
  line-height: 1rem;
  font-size: 0.875rem;
  color: #ffeb7b;
  text-align: center;
  font-family: "electronicFont";
}
.no .no-hd ul li::after {
  content: "";
  position: absolute;
  top: 25%;
  right: 0;
  height: 50%;
  width: 1px;
  background: rgba(255, 255, 255, 0.2);
}
.no .no-bd ul {
  display: flex;
}
.no .no-bd ul li {
  flex: 1;
  text-align: center;
  color: rgba(255, 255, 255, 0.7);
  font-size: 0.225rem;
  height: 0.5rem;
  line-height: 0.5rem;
  padding-top: 0.125rem;
}
.map {
  position: relative;
  height: 10.125rem;
}
.map .map1 {
  width: 6.475rem;
  height: 6.475rem;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  background: url(../images/map.png);
  background-size: 100% 100%;
  opacity: 0.3;
}
.map .map2 {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: 8.0375rem;
  height: 8.0375rem;
  background: url(../images/lbx.png);
  animation: rotate1 15s linear infinite;
  opacity: 0.6;
  background-size: 100% 100%;
}
.map .map3 {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: 7.075rem;
  height: 7.075rem;
  background: url(../images/jt.png);
  animation: rotate2 10s linear infinite;
  opacity: 0.6;
  background-size: 100% 100%;
}
.map .chart {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 10.125rem;
}
@keyframes rotate1 {
  form {
    transform: translate(-50%, -50%) rotate(0deg);
  }
  to {
    transform: translate(-50%, -50%) rotate(360deg);
  }
}
@keyframes rotate2 {
  form {
    transform: translate(-50%, -50%) rotate(0deg);
  }
  to {
    transform: translate(-50%, -50%) rotate(-360deg);
  }
}
/* 约束屏幕尺寸 */
@media screen and (max-width: 1024px) {
  html {
    font-size: 42px !important;
  }
}
@media screen and (min-width: 1920px) {
  html {
    font-size: 80px !important;
  }
}

3、index.js

①模块一:柱状图一

(function () {
    //1、实例化对象
    var myChart = echarts.init(document.querySelector(".bar .chart"));
    //2、指定配置项和数据
    var option = {
        color: ['#2f89cf'],
        tooltip: {
            trigger: 'axis',
            axisPointer: {            // 坐标轴指示器,坐标轴触发有效
                type: 'shadow'        // 默认为直线,可选为:'line' | 'shadow'
            }
        },
        //修改图表大小
        grid: {
            left: '0%',
            top: "10px",
            right: '0%',
            bottom: '4%',
            containLabel: true
        },
        xAxis: [
            {
                type: 'category',
                data: [
                    '旅游行业',
                    '教育培训',
                    '游戏行业',
                    '医疗行业',
                    '电商行业',
                    '社交行业',
                    '金融行业'
                ],
                axisTick: {
                    alignWithLabel: true
                },
                //修改刻度标签相关样式
                axisLabel: {
                    color: "rgba(255, 255, 255, 0.6)",
                    fontSize: 12,
                },
                //不显示x坐标轴
                axisLine: {
                    show: false,
                }
            }
        ],
        yAxis: [
            {
                type: 'value',
                //修改刻度标签相关样式
                axisLabel: {
                    color: "rgba(255, 255, 255, 0.6)",
                    fontSize: 12,
                },
                //设置y轴坐标轴线条的样式
                axisLine: {
                    lineStyle: {
                        color: "rgba(255, 255, 255, 0.1)",
                        width: 2,
                    },
                },
                //设置y轴分割线的样式
                splitLine: {
                    lineStyle: {
                        color: "rgba(255, 255, 255, 0.1)",
                    }
                }
            }
        ],
        series: [
            {
                name: '直接访问',
                type: 'bar',
                //修改柱子宽度
                barWidth: '35%',
                data: [200, 300, 300, 900, 1500, 1200, 600],
                itemStyle: {
                    //修改柱子圆角
                    barBorderRadius: 5,
                    //barBorderRadius: [5, 5, 0, 0] //(顺时针左上,右上,右下,左下)
                }
            }
        ]
    };
    //3、把配置项给实例对象
    myChart.setOption(option);
    //4、图表自适应屏幕
    window.addEventListener('resize', function (ev) {
        myChart.resize();
    })
})();

②模块二:柱状图二

(function () {
    //1、实例化对象
    var myChart = echarts.init(document.querySelector(".bar2 .chart"));
    var myColor = ["#1089E7", "#F57474", "#56D0E3", "#F8B448", "#8B78F6"];
    //2、指定配置项和数据
    var option = {
        grid: {
            top: "10%",
            left: '22%',
            bottom: '10%',
            //containLabel: true
        },
        xAxis: {
            show: false,
            type: 'value',
            boundaryGap: [0, 0.01],
            axisLabel: {
                color: "#fff",
            }
        },
        yAxis: [
            //两组y轴数据
            {
                type: 'category',
                inverse: true,
                data: ['HTML5', 'CSS3', 'JavaScript', 'VUE', 'NODE'],
                //不显示y轴线条
                axisLine: {
                    show: false,
                },
                //不显示刻度
                axisTick: {
                    show: false,
                },
                //设置y轴文字颜色为白色
                axisLabel: {
                    color: "#fff",
                }
            },
            {
                inverse: true,
                data: [702, 350, 610, 793, 664],
                //不显示y轴线条
                axisLine: {
                    show: false,
                },
                //不显示刻度
                axisTick: {
                    show: false,
                },
                //设置y轴文字颜色为白色
                axisLabel: {
                    color: "#fff",
                }
            },
        ],
        series: [
            {
                name: '条',
                type: 'bar',
                //柱子之间的距离
                barCategoryGap: 50,
                //柱子的宽度
                barWidth: 10,
                //柱子设为圆角
                itemStyle: {
                    barBorderRadius: 20,
                    //修改柱子颜色
                    //1.声明颜色数据 代码99行声明
                    //2.给itemStyle里面的color属性设置一个返回值函数
                    color: function(params) {
                        //params传进来的是柱子对象
                        //dataIndex是当前柱子的索引号
                        var num = myColor.length;
                        return myColor[params.dataIndex];
                    },
                },
                label: {
                    show: true,
                    //图形内显示
                    position: 'inside',
                    //柱子内文字的显示格式
                    //{c}会自动解析数据 data内的数据
                    formatter: "{c}%",
                },
                data: [70, 34, 60, 78, 69]
            },
            {
                name: '框',
                type: 'bar',
                barCategoryGap: 50,
                barWidth: 12,
                yAxisIndex: 1,
                itemStyle: {
                    color: "none",
                    borderColor: "#00c1de",
                    boderWidth: 3,
                    barBorderRadius: 15,
                },
                data: [100, 100, 100, 100, 100]
            },
        ]
    };
    //3、把配置项给实例对象
    myChart.setOption(option);
    //4、图表自适应屏幕
    window.addEventListener('resize', function (ev) {
        myChart.resize();
    })
})();

③模块三:折线图一

(function () {
    var yearData = [
        {
            year: '2020',
            data: //两条线所以两个数组
                [
                    [210,230,120,230,210,210,24,20,101,134,90,230],
                    [310,213,188,200,180,78,40,64,191,324,290,330],
                ]
        },
        {
            year: '2021',
            data: //两条线所以两个数组
                [
                    [40,64,191,324,290,330,310,213,188,200,180,78],
                    [24,20,101,134,90,230,210,230,120,230,210,210],

                ]}
    ]
    //1、实例化对象
    var myChart = echarts.init(document.querySelector(".line .chart"));
    //2、指定配置项和数据
    var option = {
        //修改两条线的颜色
        color: ['#00f2f1', '#ed3f35'],
        tooltip: {
            trigger: 'axis'
        },
        //图例组件
        legend: {
            textStyle: {
                //修改组件中文字颜色
                color: "#4c9bfd",
            },
            //10% 必须加引号
            right: "10%",
        },
        //设置网格样式
        grid: {
            top: '20%',
            left: '3%',
            right: '4%',
            bottom: '3%',
            //显示边框
            show: true,
            //边框颜色
            borderColor: '#012f4a',
            //包含刻度文字在内
            containLabel: true
        },
        xAxis: {
            type: 'category',
            axisTick: {
                //除去刻度线
                show: false,
            },
            axisLabel: {
                //文本颜色
                color: '#4c9bfd',
            },
            axisLine: {
                //去除轴线
                show: false,
            },
            //去除轴间距
            boundaryGap: false,
            data: ['1月', '2月','3月', '4月','5月', '6月','7月','8月','9月','10月','11月','12月']
        },
        yAxis: {
            type: 'value',
            axisTick: {
                //除去刻度线
                show: false,
            },
            axisLabel: {
                //文本颜色
                color: '#4c9bfd',
            },
            splitLine: {
                lineStyle: {
                    //分割线颜色
                    color: '#012f4a'
                }
            }

        },
        series: [
            {
                name: '新增粉丝',
                type: 'line',
                //让折线带弧度显示 true默认0.5
                smooth: true,
                data: yearData[0].data[0]
            },
            {
                name: '新增游客',
                type: 'line',
                //让折线带弧度显示
                smooth: true,
                data: yearData[1].data[1]
            },
        ]
    };

    //3、把配置项给实例对象
    myChart.setOption(option);
    //4、图表自适应屏幕
    window.addEventListener('resize', function (ev) {
        myChart.resize();
    });
    //5、点击 a 切换效果
    $(".line h2").on("click", "a", function () {
        //点击a之后 根据当前索引号 找到对应的yearData的相关对象
        var obj = yearData[$(this).index()];
        option.series[0].data = obj.data[0];
        option.series[1].data = obj.data[1];
        //需要重新渲染
        myChart.setOption(option);
    });
})();

④模块四:折线图二

(function () {
    //1、实例化对象
    var myChart = echarts.init(document.querySelector(".line2 .chart"));
    //2、指定配置项和数据
    var option = {
        tooltip: {
            trigger: 'axis',
            axisPointer: {
                type: 'cross',
                label: {
                    backgroundColor: '#6a7985'
                }
            }
        },
        legend: {
            top: '0%',
            textStyle: {
                color: "rgba(255, 255, 255, 0.5)",
                fontSize: 12,
            },
            data: ['邮件营销', '联盟广告']
        },
        grid: {
            left: '10',
            top: '30',
            right: '10',
            bottom: '10',
            containLabel: true
        },
        xAxis: [
            {
                type: 'category',
                axisLine: {
                    lineStyle: {
                        color: "rgba(255, 255, 255, 0.2)"
                    }
                },
                //文本标签
                axisLabel: {
                    textStyle: {
                        color: "rgba(255, 255, 255, 0.6)",
                        fontSize: 12,
                    },
                },
                boundaryGap: false,
                data: [
                    '1','2','3','4','5','6','7','8','9','10',
                    '11','12','13','14','15','16','17','18','19','20',
                    '21','22','23','24','25','26','27','28','29','30',
                ],
            }
        ],
        yAxis: [
            {
                type: 'value',
                axisTick: {
                    show: false
                },
                axisLine: {
                    lineStyle: {
                        color: "rgba(255, 255, 255, 0.1)",
                    }
                },
                axisLabel: {
                    textStyle: {
                        color: "rgba(255, 255, 255, 0.6)",
                        fontSize: 12,
                    }
                },
                //修改分割线颜色
                splitLine: {
                    lineStyle: {
                        color: "rgba(255, 255, 255, 0.1)",
                    }
                }
            }
        ],
        series: [
            {
                name: '播放量',
                type: 'line',
                smooth: 'true',
                //单独修改线条样式
                lineStyle: {
                    color: "#0184d5",
                    width: "2",
                },
                //填充区域颜色设置
                // 填充颜色设置
                areaStyle: {
                    color: new echarts.graphic.LinearGradient(
                        0,
                        0,
                        0,
                        1,
                        [
                            {
                                offset: 0,
                                // 渐变色的起始颜色
                                color: "rgba(1, 132, 213, 0.4)"
                            },
                            {
                                offset: 0.8,
                                // 渐变线的结束颜色
                                color: "rgba(1, 132, 213, 0.1)"
                            }
                        ],
                        false
                    ),
                    shadowColor: "rgba(0, 0, 0, 0.1)"
                },
                //设置拐点 此案例设置为小圆点
                symbol: "circle",
                //拐点大小
                symbolSize: 7,
                itemStyle: {
                    color: "#0184d5",
                    borderColor: "rgba(221, 220, 107, 0.1)",
                    borderWidth: 12,
                },
                //开始时不显示,设置为鼠标经过显示
                showSymbol: false,
                data: [
                    120, 132, 101, 134, 90,
                    230, 210, 150, 255, 164,
                    210, 279, 130, 345, 180,
                    120, 132, 101, 134, 90,
                    210, 279, 130, 345, 180,
                    220, 270 ,190,279, 130
                ]
            },
            {
                name: '转发量',
                type: 'line',
                smooth: 'true',
                //单独修改线条样式
                lineStyle: {
                    color: "#00d887",
                    width: "2",
                },
                //填充区域颜色设置
                // 填充颜色设置
                areaStyle: {
                    color: new echarts.graphic.LinearGradient(
                        0,
                        0,
                        0,
                        1,
                        [
                            {
                                offset: 0,
                                // 渐变色的起始颜色
                                color: "rgba(0, 216, 135, 0.4)"
                            },
                            {
                                offset: 0.8,
                                // 渐变线的结束颜色
                                color: "rgba(0, 216, 135, 0.1)"
                            }
                        ],
                        false
                    ),
                    shadowColor: "rgba(0, 0, 0, 0.1)"
                },
                //设置拐点 此案例设置为小圆点
                symbol: "circle",
                //拐点大小
                symbolSize: 5,
                itemStyle: {
                    color: "#00d887",
                    borderColor: "rgba(221, 220, 107, 0.1)",
                    borderWidth: 8,
                },
                //开始时不显示,设置为鼠标经过显示
                showSymbol: false,
                data: [
                    220, 182, 191, 234, 290,
                    210, 279, 130, 345, 180,
                    220, 270 ,190,279, 130,
                    220, 182, 191, 234, 290,
                    330, 310,210, 279, 130,
                    120, 132, 101, 134, 90,
                ]
            },
        ]
    };
    //3、把配置项给实例对象
    myChart.setOption(option);
    //4、图表自适应屏幕
    window.addEventListener('resize', function (ev) {
        myChart.resize();
    })
})();

⑤模块五:饼形图一

(function () {
    //1、实例化对象
    var myChart = echarts.init(document.querySelector(".pie .chart"));
    //2、指定配置项和数据
    var option = {
        color: [
            "#065aab",
            "#066eab",
            "#0682ab",
            "#0696ab",
            "#06a0ab",
        ],
        tooltip: {
            trigger: 'item',
            formatter: '{a} 
{b}: {c} ({d}%)' }, legend: { //底部距离 bottom: "0%", //修改小图标的宽度和高度 itemWidth: 10, itemHeight: 10, //文字颜色大小 textStyle: { color: "rgba(255, 255, 255, 0.5)", fontSize: "12", }, data: ['20岁以下', '20-29岁', '30-39岁', '40-49岁', '50-59岁'] }, series: [ { name: '年龄分布', type: 'pie', //设置饼形图在容器内的位置 center: ["50%", "50%"], //修改 内圆半径 和 外圆半径 为百分比是相对于容器来说的 radius: ['40%', '60%'], avoidLabelOverlap: false, //图形上的文字—隐藏 label: { //不显示标签文字 show: false, }, labelLine: { //不显示图形与文字的连接线 show: false }, data: [ {value: 335, name: '20岁以下'}, {value: 310, name: '20-29岁'}, {value: 234, name: '30-39岁'}, {value: 135, name: '40-49岁'}, {value: 1548, name: '50-59岁'} ] } ] }; //3、把配置项给实例对象 myChart.setOption(option); //4、图表自适应屏幕 window.addEventListener('resize', function (ev) { myChart.resize(); }) })();

⑥模块六:饼形图二

(function () {
    //1、实例化对象
    var myChart = echarts.init(document.querySelector(".pie2 .chart"));
    //2、指定配置项和数据
    var option = {
        color: [
            "#006cff",
            "#60cda0",
            "#ed8884",
            "#ff9f7f",
            "#9fe6b8",
            "#0096ff",
            "#32c5e9",
            "#1d9dff",
        ],
        //提示信息
        tooltip: {
            trigger: 'item',
            formatter: '{a} 
{b} : {c} ({d}%)' }, legend: { //底部距离 bottom: "0%", //修改小图标的宽度和高度 itemWidth: 10, itemHeight: 10, //文字颜色大小 textStyle: { color: "rgba(255, 255, 255, 0.5)", fontSize: "12", }, data: ['北京', '深圳', '上海', '武汉', '成都', '重庆', '海南','长沙'] }, series: [ { name: '地区分布', type: 'pie', radius: ['10%', '70%'], center: ['50%', '50%'], //文字标签控制图形文字的样式,是一个对象 label: { fontSize: 10, }, //链接图形和文字的线条 labelLine: { smooth: 0.2, //链接图形的线条 length: 10, //链接文字的线条 length2: 20 }, data: [ {value: 500, name: '北京'}, {value: 310, name: '深圳'}, {value: 274, name: '上海'}, {value: 235, name: '武汉'}, {value: 120, name: '成都'}, {value: 190, name: '重庆'}, {value: 274, name: '海南'}, {value: 400, name: '长沙'} ].sort(function (a, b) { return a.value - b.value; }), roseType: 'radius', animationType: 'scale', animationEasing: 'elasticOut', animationDelay: function (idx) { return Math.random() * 200; } } ] }; //3、把配置项给实例对象 myChart.setOption(option); //4、图表自适应屏幕 window.addEventListener('resize', function (ev) { myChart.resize(); }) })();

4、myMap.js(ECharts实例复制的)

//模拟飞行路线模块地图模块
(function() {
  // 1. 实例化对象
  var myChart = echarts.init(document.querySelector(".map .chart"));
  // 2. 指定配置和数据
  // 2. 指定配置和数据
  var geoCoordMap = {
    上海: [121.4648, 31.2891],
    东莞: [113.8953, 22.901],
    东营: [118.7073, 37.5513],
    中山: [113.4229, 22.478],
    临汾: [111.4783, 36.1615],
    临沂: [118.3118, 35.2936],
    丹东: [124.541, 40.4242],
    丽水: [119.5642, 28.1854],
    乌鲁木齐: [87.9236, 43.5883],
    佛山: [112.8955, 23.1097],
    保定: [115.0488, 39.0948],
    兰州: [103.5901, 36.3043],
    包头: [110.3467, 41.4899],
    北京: [116.4551, 40.2539],
    北海: [109.314, 21.6211],
    南京: [118.8062, 31.9208],
    南宁: [108.479, 23.1152],
    南昌: [116.0046, 28.6633],
    南通: [121.1023, 32.1625],
    厦门: [118.1689, 24.6478],
    台州: [121.1353, 28.6688],
    合肥: [117.29, 32.0581],
    呼和浩特: [111.4124, 40.4901],
    咸阳: [108.4131, 34.8706],
    哈尔滨: [127.9688, 45.368],
    唐山: [118.4766, 39.6826],
    嘉兴: [120.9155, 30.6354],
    大同: [113.7854, 39.8035],
    大连: [122.2229, 39.4409],
    天津: [117.4219, 39.4189],
    太原: [112.3352, 37.9413],
    威海: [121.9482, 37.1393],
    宁波: [121.5967, 29.6466],
    宝鸡: [107.1826, 34.3433],
    宿迁: [118.5535, 33.7775],
    常州: [119.4543, 31.5582],
    广州: [113.5107, 23.2196],
    廊坊: [116.521, 39.0509],
    延安: [109.1052, 36.4252],
    张家口: [115.1477, 40.8527],
    徐州: [117.5208, 34.3268],
    德州: [116.6858, 37.2107],
    惠州: [114.6204, 23.1647],
    成都: [103.9526, 30.7617],
    扬州: [119.4653, 32.8162],
    承德: [117.5757, 41.4075],
    拉萨: [91.1865, 30.1465],
    无锡: [120.3442, 31.5527],
    日照: [119.2786, 35.5023],
    昆明: [102.9199, 25.4663],
    杭州: [119.5313, 29.8773],
    枣庄: [117.323, 34.8926],
    柳州: [109.3799, 24.9774],
    株洲: [113.5327, 27.0319],
    武汉: [114.3896, 30.6628],
    汕头: [117.1692, 23.3405],
    江门: [112.6318, 22.1484],
    沈阳: [123.1238, 42.1216],
    沧州: [116.8286, 38.2104],
    河源: [114.917, 23.9722],
    泉州: [118.3228, 25.1147],
    泰安: [117.0264, 36.0516],
    泰州: [120.0586, 32.5525],
    济南: [117.1582, 36.8701],
    济宁: [116.8286, 35.3375],
    海口: [110.3893, 19.8516],
    淄博: [118.0371, 36.6064],
    淮安: [118.927, 33.4039],
    深圳: [114.5435, 22.5439],
    清远: [112.9175, 24.3292],
    温州: [120.498, 27.8119],
    渭南: [109.7864, 35.0299],
    湖州: [119.8608, 30.7782],
    湘潭: [112.5439, 27.7075],
    滨州: [117.8174, 37.4963],
    潍坊: [119.0918, 36.524],
    烟台: [120.7397, 37.5128],
    玉溪: [101.9312, 23.8898],
    珠海: [113.7305, 22.1155],
    盐城: [120.2234, 33.5577],
    盘锦: [121.9482, 41.0449],
    石家庄: [114.4995, 38.1006],
    福州: [119.4543, 25.9222],
    秦皇岛: [119.2126, 40.0232],
    绍兴: [120.564, 29.7565],
    聊城: [115.9167, 36.4032],
    肇庆: [112.1265, 23.5822],
    舟山: [122.2559, 30.2234],
    苏州: [120.6519, 31.3989],
    莱芜: [117.6526, 36.2714],
    菏泽: [115.6201, 35.2057],
    营口: [122.4316, 40.4297],
    葫芦岛: [120.1575, 40.578],
    衡水: [115.8838, 37.7161],
    衢州: [118.6853, 28.8666],
    西宁: [101.4038, 36.8207],
    西安: [109.1162, 34.2004],
    贵阳: [106.6992, 26.7682],
    连云港: [119.1248, 34.552],
    邢台: [114.8071, 37.2821],
    邯郸: [114.4775, 36.535],
    郑州: [113.4668, 34.6234],
    鄂尔多斯: [108.9734, 39.2487],
    重庆: [107.7539, 30.1904],
    金华: [120.0037, 29.1028],
    铜川: [109.0393, 35.1947],
    银川: [106.3586, 38.1775],
    镇江: [119.4763, 31.9702],
    长春: [125.8154, 44.2584],
    长沙: [113.0823, 28.2568],
    长治: [112.8625, 36.4746],
    阳泉: [113.4778, 38.0951],
    青岛: [120.4651, 36.3373],
    韶关: [113.7964, 24.7028]
  };

  var XAData = [
    [{ name: "西安" }, { name: "北京", value: 100 }],
    [{ name: "西安" }, { name: "上海", value: 100 }],
    [{ name: "西安" }, { name: "广州", value: 100 }],
    [{ name: "西安" }, { name: "西宁", value: 100 }],
    [{ name: "西安" }, { name: "拉萨", value: 100 }]
  ];

  var XNData = [
    [{ name: "西宁" }, { name: "北京", value: 100 }],
    [{ name: "西宁" }, { name: "上海", value: 100 }],
    [{ name: "西宁" }, { name: "广州", value: 100 }],
    [{ name: "西宁" }, { name: "西安", value: 100 }],
    [{ name: "西宁" }, { name: "银川", value: 100 }]
  ];

  var YCData = [
    [{ name: "拉萨" }, { name: "北京", value: 100 }],
    [{ name: "拉萨" }, { name: "潍坊", value: 100 }],
    [{ name: "拉萨" }, { name: "哈尔滨", value: 100 }]
  ];

  var planePath =
    "path://M1705.06,1318.313v-89.254l-319.9-221.799l0.073-208.063c0.521-84.662-26.629-121.796-63.961-121.491c-37.332-0.305-64.482,36.829-63.961,121.491l0.073,208.063l-319.9,221.799v89.254l330.343-157.288l12.238,241.308l-134.449,92.931l0.531,42.034l175.125-42.917l175.125,42.917l0.531-42.034l-134.449-92.931l12.238-241.308L1705.06,1318.313z";
  //var planePath = 'arrow';
  var convertData = function(data) {
    var res = [];
    for (var i = 0; i < data.length; i++) {
      var dataItem = data[i];

      var fromCoord = geoCoordMap[dataItem[0].name];
      var toCoord = geoCoordMap[dataItem[1].name];
      if (fromCoord && toCoord) {
        res.push({
          fromName: dataItem[0].name,
          toName: dataItem[1].name,
          coords: [fromCoord, toCoord],
          value: dataItem[1].value
        });
      }
    }
    return res;
  };

  var color = ["#fff", "#fff", "#fff"]; //航线的颜色
  var series = [];
  [
    ["西安", XAData],
    ["西宁", XNData],
    ["银川", YCData]
  ].forEach(function(item, i) {
    series.push(
      {
        name: item[0] + " Top3",
        type: "lines",
        zlevel: 1,
        effect: {
          show: true,
          period: 6,
          trailLength: 0.7,
          color: "red", //arrow箭头的颜色
          symbolSize: 3
        },
        lineStyle: {
          normal: {
            color: color[i],
            width: 0,
            curveness: 0.2
          }
        },
        data: convertData(item[1])
      },
      {
        name: item[0] + " Top3",
        type: "lines",
        zlevel: 2,
        symbol: ["none", "arrow"],
        symbolSize: 10,
        effect: {
          show: true,
          period: 6,
          trailLength: 0,
          symbol: planePath,
          symbolSize: 15
        },
        lineStyle: {
          normal: {
            color: color[i],
            width: 1,
            opacity: 0.6,
            curveness: 0.2
          }
        },
        data: convertData(item[1])
      },
      {
        name: item[0] + " Top3",
        type: "effectScatter",
        coordinateSystem: "geo",
        zlevel: 2,
        rippleEffect: {
          brushType: "stroke"
        },
        label: {
          normal: {
            show: true,
            position: "right",
            formatter: "{b}"
          }
        },
        symbolSize: function(val) {
          return val[2] / 8;
        },
        itemStyle: {
          normal: {
            color: color[i]
          },
          emphasis: {
            areaColor: "#2B91B7"
          }
        },
        data: item[1].map(function(dataItem) {
          return {
            name: dataItem[1].name,
            value: geoCoordMap[dataItem[1].name].concat([dataItem[1].value])
          };
        })
      }
    );
  });
  var option = {
    tooltip: {
      trigger: "item",
      formatter: function(params, ticket, callback) {
        if (params.seriesType == "effectScatter") {
          return "线路:" + params.data.name + "" + params.data.value[2];
        } else if (params.seriesType == "lines") {
          return (
            params.data.fromName +
            ">" +
            params.data.toName +
            "
" + params.data.value ); } else { return params.name; } } }, geo: { map: "china", label: { emphasis: { show: true, color: "#fff" } }, roam: false, // 放大我们的地图 zoom: 1, itemStyle: { normal: { areaColor: "rgba(43, 196, 243, 0.42)", borderColor: "rgba(43, 196, 243, 1)", borderWidth: 1 }, emphasis: { areaColor: "#2B91B7" } } }, series: series }; myChart.setOption(option); window.addEventListener("resize", function() { myChart.resize(); }); })();

 

你可能感兴趣的:(WEB前端笔记)