Echarts

1. 常见的数据可视化库

2. Echarts简介

Echarts--一个使用js实现的开源可视化库,可以流畅的运行在PC和移动设备上,兼容当前绝大部分浏览器,底层依赖矢量图形库ZRender,提供直观,交互丰富,可高度个性化定制的数据可视化图标。

3. Echarts使用五部曲

  1. 下载并引入echarts.js文件

  2. 准备一个具备大小的DOM容器(必须设置好具体的宽高)

  3. 初始化echarts实例对象

  4. 指定配置项和数据(根据具体需求修改配置选项)

  5. 将配置项设置给echarts实例对象,让echarts对象根据修改好的配置生效

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> /* 2. */ .box { width: 300px; height: 300px; background-color: pink; } </style> </head> <body>
    <script src="js/echarts.min.js"></script> <script> // echarts.init(一定要写dom容器) var myChart = echarts.init(document.querySelector(".box")) // 4. 指定配置项和数据 var option = { title: { text: ' 入门示例教程 ' }, tooltip: {}, legend: { data: ['销量'] }, xAxis: { data: ['Shirts', 'Cardigans', 'Chiffons', 'Pants', 'Heels', 'Socks'] }, yAxis: {}, series: [ { name: '销量', type: 'bar', data: [5, 20, 36, 10, 10, 20] } ] }; // 5. 将option(配置项)给mychart(实例对象) myChart.setOption(option) </script> </body> </html>

4.基础配置

目前知道以下配置每个模块的主要作用干什么的就行,具体的到了项目再说。
文档的配置项手册可以查到很多相关信息

复制代码
option = {
// 设置线条的颜色,后面用的是数组
color: ['pink', 'green', 'red', 'skyblue' ],
	// 标题
  title: {
    text: 'Stacked Line'
  },
  // 提示框
  tooltip: {
  // 触发方式
    trigger: 'axis'
    //如果是柱状图可以将axis换成item(文档的配置项手册可以查到)
  },
  // 图例组件
  legend: {
    data: ['Email', 'Union Ads', 'Video Ads', 'Direct', 'Search Engine']
  },
  // 网格配置 grid可以控制线形图,柱状图,图标大小
  grid: {
    left: '3%',
    right: '4%',
    bottom: '3%',
    // 显示刻度标签
    containLabel: true
  },
  // 工具箱组件,可以保存为图片等功能
  toolbox: {
    feature: {
      saveAsImage: {}
    }
  },
  // 设置x轴的相关配置
  xAxis: {
  // 坐标轴类型:竖直轴,类目轴,时间轴,对数轴
    type: 'category',
    // 是否让线条和坐标轴有缝隙
    boundaryGap: false,
    // 还可修改文字颜色以及大小
    data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
  },
  // y轴
  yAxis: {
  // 坐标轴类型,同上
    type: 'value'
  },
  // 系列图标配置 决定着显示那种类型的图标
  series: [
    {
    // 如果series中有name,那就不用legend
      name: 'Email',
      // line 折线图 bar 柱形图...
      type: 'line',
      // 数据堆叠,120
      stack: 'Total',
      data: [120, 132, 101, 134, 90, 230, 210]
    },
    {
      name: 'Union Ads',
      type: 'line',
      // 数据堆叠 120+220,以此类推
      stack: 'Total',
      data: [220, 182, 191, 234, 290, 330, 310]
    },
    {
      name: 'Video Ads',
      type: 'line',
      stack: 'Total',
      data: [150, 232, 201, 154, 190, 330, 410]
    },
    {
      name: 'Direct',
      type: 'line',
      stack: 'Total',
      data: [320, 332, 301, 334, 390, 330, 320]
    },
    {
      name: 'Search Engine',
      type: 'line',
      stack: 'Total',
      data: [820, 932, 901, 934, 1290, 1330, 1320]
    }
  ]
};

5. 将柱状图引入到页面中

  1. 在官网中找到类似的实例,适当分析,并引入到HTML页面中
  2. 根据需求定制图表

立即执行函数

为了阻止变量污染,减少命名冲突,用立即执行函数,里面的变量都是局部变量

复制代码
// 柱状图模块1
(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,.6)",
                fontSize: "12"
            },
            // 不显示x轴的样式
            axisLine: {
                show: false,
                // 如果想要设置单独的线条样式
                // lineStyle: {
                //     color: "rgba(255,255,255,.1)",
                //     width: 1,
                //     type: "solid"
                // }
            }
            }
        ],
        yAxis: [
            {
            type: 'value',
            // 修改刻度标签 相关样式
            axisLabel: {
                color: "rgba(255,255,255,.6)",
                fontSize: "12"
            },
            axisLine: {
                // 如果想要设置单独的线条样式
                lineStyle: {
                    color: "rgba(255,255,255,.1)",
                    width: 1,
                    type: "solid"
                }
            },
            // y轴分割线样式
            splitLine: {
                lineStyle: {
                    color: "rgba(255,255,255,.1)"
                }
            }
            }
        ],
        series: [
            {
            name: 'Direct',
            type: 'bar',
            barWidth: '35%',
            data: [10, 52, 200, 334, 390, 330, 220],
            itemStyle: {
                // 修改柱子圆角
                barBorderRadius: 5
            }
            }
        ]
    };
    //3. 把配置项给实例对象
    myChart.setOption(option)
    // 4. 让图表跟随屏幕自动的去适应
    window.addEventListener("resize", function(){
        myChart.resize()
    })
})();

关键的一点

让图表跟随屏幕自动的去适应

复制代码
  window.addEventListener("resize", function() {
    myChart.resize();
  });

6.柱形图2

  1. 刻度是短横线,文字叫刻度标签

  2. axisLabel:修改刻度标签里面的文字颜色

  3. {c} 会自动的解析为 数据 data里面的数据
    formatter: "{c}%"
    {a}:系列名
    {b}:数据名
    {c}:数据值
    柱子

  4. 柱子颜色可以使用函数
    color: function(params) {
    // params 传进来的是柱子对象
    // console.log(params);
    // dataIndex 是当前柱子的索引号
    // 把mycolor的颜色返回给color这个函数的颜色
    return myColor[params.dataIndex];
    }
    },

  5. 让框框压住第一个bar,用yAxisIndex实现层叠

  6. 是否反向坐标 inverse

    // 柱状图2
    (function() {
    var myColor = ["#1089E7", "#F57474", "#56D0E3", "#F8B448", "#8B78F6"];
    // 1. 实例化对象
    var myChart = echarts.init(document.querySelector(".bar2 .chart"));
    // 2. 指定配置和数据
    var option = {
    grid: {
    top: "10%",
    left: "22%",
    bottom: "10%"
    // containLabel: true
    },
    // 不显示x轴的相关信息
    xAxis: {
    show: false
    },
    yAxis: [
    {
    type: "category",
    inverse: true,
    data: ["HTML5", "CSS3", "javascript", "VUE", "NODE"],
    // 不显示y轴的线
    axisLine: {
    show: false
    },
    // 不显示刻度
    axisTick: {
    show: false
    },
    // 把刻度标签里面的文字颜色设置为白色
    axisLabel: {
    color: "#fff"
    }
    },
    {
    data: [702, 350, 610, 793, 664],
    inverse: true,
    // 不显示y轴的线
    axisLine: {
    show: false
    },
    // 不显示刻度
    axisTick: {
    show: false
    },
    // 把刻度标签里面的文字颜色设置为白色
    axisLabel: {
    color: "#fff"
    }
    }
    ],
    series: [
    {
    name: "条",
    type: "bar",
    data: [70, 34, 60, 78, 69],
    yAxisIndex: 0,
    // 修改第一组柱子的圆角
    itemStyle: {
    barBorderRadius: 20,
    // 此时的color 可以修改柱子的颜色
    color: function(params) {
    // params 传进来的是柱子对象
    // console.log(params);
    // dataIndex 是当前柱子的索引号
    return myColor[params.dataIndex];
    }
    },
    // 柱子之间的距离
    barCategoryGap: 50,
    //柱子的宽度
    barWidth: 10,
    // 显示柱子内的文字
    label: {
    show: true,
    position: "inside",
    // {c} 会自动的解析为 数据 data里面的数据
    formatter: "{c}%"
    }
    },
    {
    name: "框",
    type: "bar",
    barCategoryGap: 50,
    barWidth: 15,
    yAxisIndex: 1,
    data: [100, 100, 100, 100, 100],
    itemStyle: {
    color: "none",
    borderColor: "#00c1de",
    borderWidth: 3,
    barBorderRadius: 15
    }
    }
    ]
    };

    // 3. 把配置给实例对象
    myChart.setOption(option);
    // 4. 让图表跟随屏幕自动的去适应
    window.addEventListener("resize", function() {
    myChart.resize();
    });
    })();

6. 折线图1

  1. 让折线变得圆滑用 smooth: true,(在series中写)

  2. 想要修改y轴分割线颜色
    splitLine: {
    lineStyle: {
    color: "#012f4a" // 分割线颜色
    }
    }

  3. 保存为图片按钮
    toolbox: {
    // 保存为图片,有需要就要,没有就不要
    feature: {
    saveAsImage: {}
    }
    }

  4. 如果series 对象有name 值,则 legend可以不用写data

  5. 在这个折线图中有如何点击不同的年份进行切换数据的答案

    // 折线图1
    (function() {
    var yearData = [
    {
    year: "2020", // 年份
    data: [
    // 两个数组是因为有两条线
    [24, 40, 101, 134, 90, 230, 210, 230, 120, 230, 210, 120],
    [40, 64, 191, 324, 290, 330, 310, 213, 180, 200, 180, 79]
    ]
    },
    {
    year: "2021", // 年份
    data: [
    // 两个数组是因为有两条线
    [123, 175, 112, 197, 121, 67, 98, 21, 43, 64, 76, 38],
    [143, 131, 165, 123, 178, 21, 82, 64, 43, 60, 19, 34]
    ]
    }
    ];
    // 1. 实例化对象
    var myChart = echarts.init(document.querySelector(".line .chart"))
    // 2. 指定配置
    option = {
    // 修改两条线的颜色
    color: ['#00f2f1', '#ed3f35'],
    tooltip: {
    trigger: 'axis'
    },
    legend: {
    // 如果series 对象有name 值,则 legend可以不用写data
    data: ['Email', 'Union Ads', 'Video Ads', 'Direct', 'Search Engine'],
    // 修改图例组件文字颜色
    textStyle: {
    color: "#4c9bfd",
    },
    // 修改图例位置
    right: "10%" // 必须加引号
    },
    grid: {
    top: '20%',
    left: '3%',
    right: '4%',
    bottom: '3%',
    show: true, //显示边框
    borderColor: '#012f4a', // 边框颜色
    containLabel: true // 包含刻度文字在内
    },
    toolbox: {
    // 保存为图片,有需要就要,没有就不要
    // feature: {
    // saveAsImage: {}
    // }
    },
    xAxis: {
    type: 'category',
    // 去除轴间距
    boundaryGap: false,
    data: [
    "1月",
    "2月",
    "3月",
    "4月",
    "5月",
    "6月",
    "7月",
    "8月",
    "9月",
    "10月",
    "11月",
    "12月"
    ],
    axisTick: {
    show: false // 去除刻度线
    },
    axisLabel: {
    color: "#4c9bfd" // 文本颜色
    },
    axisLine: {
    show: false // 去除轴线
    }
    },
    yAxis: {
    type: 'value',
    axisTick: {
    show: false // 去除刻度线
    },
    axisLabel: {
    color: "#4c9bfd" // 文本颜色
    },
    axisLine: {
    show: false // 去除轴线
    },
    // y轴分隔线
    splitLine: {
    lineStyle: {
    color: "#012f4a" // 分割线颜色
    }
    }
    },
    series: [
    {
    name: '新增粉丝',
    type: 'line',
    // 让折线变得圆滑
    smooth: true,
    stack: 'Total',
    data: yearData[0].data[0]
    },
    {
    name: '新增游客',
    type: 'line',
    // 让折线变得圆滑
    smooth: true,
    stack: 'Total',
    data: yearData[0].data[1]
    },
    ]
    };
    // 3. 把配置给实例对象
    myChart.setOption(option)
    // 4. 让图表跟随屏幕自动的去适应
    window.addEventListener("resize", function() {
    myChart.resize();
    });
    // 5. 点击切换效果
    (".line h2").on("click", "a", function() { // 根据索引号的不同判断点击的是2020还是2021,在找到yearData的相关元素 // 当前a的索引号是(this).index()
    var obj = yearData[$(this).index()];
    // 把yeardata中的第一组数据中的data中的第一组赋值给option中的data中的第一个对象
    option.series[0].data = obj.data[0]
    // 同理
    option.series[1].data = obj.data[1]
    // 重新渲染对象
    myChart.setOption(option)
    })
    })()

7.折线图2

  1. 定制填充渐变区域:

    // 填充区域
    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)"
    },

8. 饼形图

  1. 10%必须加引号 bottom: "0%"

  2. 不显示标签文字 label: { show: false, position: 'center' },

  3. 只要series中有name,就不用legend中的data

  4. 连接文字和图形的线是否显示出来 labelLine: {show: false},

    // 饼形图1
    (function(){
    //1. 实例化对象
    var myChart = echarts.init(document.querySelector(".pie .chart"))
    // 2. 指定配置
    option = {
    color: ["#065aab", "#066eab", "#0682ab", "#0696ab", "#06a0ab"],
    tooltip: {
    trigger: 'item',
    formatter: '{a}
    {b}: {c} ({d}%)'
    },
    legend: {
    // orient: "vertical",
    itemHeight: 10,
    itemWidth: 10,
    bottom: "0%",
    // 修改图例组件的文字为12px
    textStyle: {
    color: "rgba(255, 255, 255, .5)",
    fontSize: "12"
    }
    },
    series: [
    {
    // 修改饼形图的垂直居中和水平居中,默认的就是水平和垂直居中
    center: ["50%", "40%"],
    name: '年龄分布',
    type: 'pie',
    // 修改内圈半径和外圈半径为 百分比是相对于容器宽度来说的
    // 即修改饼形图的大小
    radius: ['40%', '60%'],
    avoidLabelOverlap: false,
    label: {
    // 不显示标签文字
    show: false,
    // 在圆圈中间,否则在圆圈外面
    position: 'center'
    },
    // 圆圈中间的文字以及加粗等效果
    // emphasis: {
    // label: {
    // show: true,
    // fontSize: 40,
    // fontWeight: 'bold'
    // }
    // },
    // 连接文字和图形的线是否显示出来
    labelLine: {
    show: false
    },
    data: [
    { value: 1, name: "0岁以下" },
    { value: 4, name: "20-29岁" },
    { value: 2, name: "30-39岁" },
    { value: 2, name: "40-49岁" },
    { value: 1, name: "50岁以上" }
    ]
    }
    ]
    };
    // 3. 将配置给实例化对象
    myChart.setOption(option)
    // 4. 让图表跟随屏幕自动的去适应
    window.addEventListener("resize", function() {
    myChart.resize();
    });
    })();

9.饼形图2

  1. 饼形图有半径模式和面积模式

    series: [
    {
    // 通过半径来显示不同
    name: '半径模式',
    type: 'pie',
    roseType: 'radius',
    }
    ]

  2. 修改连接线的长度

    // 连接线的长度
    labelLine: {
    // 连接图形的线
    length: 1,
    // 连接文字的线
    length: 2
    },

    // 饼形图2
    (function() {
    // 1. 实例化对象
    var myChart = echarts.init(document.querySelector(".pie2 .chart"))
    // 2. 指定配置
    option = {
    color: [
    "#006cff",
    "#60cda0",
    "#ed8884",
    "#ff9f7f",
    "#0096ff",
    "#9fe6b8",
    "#32c5e9",
    "#1d9dff"
    ],
    tooltip: {
    trigger: 'item',
    formatter: '{a}
    {b} : {c} ({d}%)'
    },
    legend: {
    bottom: "0%",
    itemHeight: 10,
    // 修改图例组件的文字为 12px
    textStyle: {
    color: "rgba(255,255,255,.5)",
    fontSize: "12"
    }
    },
    // // 工具箱:还原,视图,保存图片等
    // toolbox: {
    // show: true,
    // feature: {
    // mark: { show: true },
    // dataView: { show: true, readOnly: false },
    // restore: { show: true },
    // saveAsImage: { show: true }
    // }
    // },
    series: [
    {
    // 通过半径来显示不同
    name: '半径模式',
    type: 'pie',
    // 修改饼形图的大小
    radius: ["10%","70%"],
    // 位置
    center: ['50%', '50%'],
    roseType: 'radius',
    // 图形文字标签
    label: {
    fontSize: 10,
    },
    // 连接线的长度
    labelLine: {
    // 连接图形的线
    length: 6,
    // 连接文字的线
    length: 8
    },
    itemStyle: {
    borderRadius: 5
    },
    data: [
    { value: 20, name: "云南" },
    { value: 26, name: "北京" },
    { value: 24, name: "山东" },
    { value: 25, name: "河北" },
    { value: 20, name: "江苏" },
    { value: 25, name: "浙江" },
    { value: 30, name: "四川" },
    { value: 42, name: "湖北" }
    ]
    }
    ]
    };
    // 3. 把配置给实例化
    myChart.setOption(option)
    // 4. 让图表跟随屏幕自动的去适应
    window.addEventListener("resize", function() {
    myChart.resize();
    });
    })();

10. 中国地图

在echarts社区,可以找到,一些高手交流和贡献定制好的图标的地方。在这里可以找到一些基于echart的高度制定好的图标,相当于基于jquery开发的插件,这里是基于echarts开发的第三方图标。

  1. 地图省份的背景颜色 areaColor: "rgba(20, 41, 87,0.6)"

  2. 放大地图 :把中国地图放大了1.2倍 zoom: 1.2

  3. 对整个屏幕的尺寸进行一个约束

    /* 约束屏幕尺寸 */
    @media screen and (max-width: 1024px) {
    html {
    font-size: 42px !important;
    }
    }
    @media screen and (min-width: 1920px) {
    html {
    font-size: 80px !important;
    }
    }

    // 模拟飞行路线模块地图模块
    (function() {
    // 1.
    var myChart = echarts.init(document.querySelector(".map .chart"));
    // 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 }],
    [{ 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 = ["#a6c84c", "#ffa022", "#46bee9"]; //航线的颜色
    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;
    }
    }
    },
    legend: {
    orient: "vertical",
    top: "bottom",
    left: "right",
    data: ["西安 Top3", "西宁 Top3", "银川 Top3"],
    textStyle: {
    color: "#fff"
    },
    selectedMode: "multiple"
    },
    geo: {
    map: "china",
    label: {
    emphasis: {
    show: true,
    color: "#fff"
    }
    },
    // 把中国地图放大了1.2倍
    zoom: 1.2,
    roam: true,
    itemStyle: {
    normal: {
    // 地图省份的背景颜色
    areaColor: "rgba(20, 41, 87,0.6)",
    borderColor: "#195BB9",
    borderWidth: 1
    },
    emphasis: {
    areaColor: "#2B91B7"
    }
    }
    },
    series: series
    };
    // 3.
    myChart.setOption(option);
    // 4. 监听浏览器缩放,图表对象调用缩放resize函数
    window.addEventListener("resize", function() {
    myChart.resize();
    });
    })();

相关推荐
崔庆才丨静觅1 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60612 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了2 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅2 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅2 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅3 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment3 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅3 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊3 小时前
jwt介绍
前端
爱敲代码的小鱼3 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax