在数据可视化领域,地图图表因其直观性和信息承载量而备受青睐。ECharts 作为国内流行的开源可视化库,提供了丰富的地图图表绘制功能。今天,我们就来一起探索如何使用 ECharts 画出酷炫的地图图表,通过5个实用案例,让你轻松入门。

案例一:中国地图的省份分布

1.1 准备工作

首先,确保你已经安装了 ECharts 库。可以通过 CDN 链接引入:

<script src="https://cdn.bootcdn.net/ajax/libs/echarts/5.3.3/echarts.min.js"></script>

1.2 代码实现

以下是一个简单的中国地图省份分布案例:

var myChart = echarts.init(document.getElementById('main'));

var option = {
    title: {
        text: '中国地图省份分布'
    },
    tooltip: {
        trigger: 'item'
    },
    visualMap: {
        min: 0,
        max: 100,
        left: 'left',
        top: 'bottom',
        text: ['高','低'],           // 文本,默认为数值文本
        calculable: true
    },
    series: [
        {
            name: '中国',
            type: 'map',
            mapType: 'china',
            roam: true,
            label: {
                show: true
            },
            data: [
                {name: '北京', value: Math.round(Math.random() * 1000)},
                {name: '上海', value: Math.round(Math.random() * 1000)},
                // ... 其他省份
            ]
        }
    ]
};

myChart.setOption(option);

1.3 代码解析

  • echarts.init() 初始化图表实例。
  • option 对象中定义了图表的配置项。
  • visualMap 用于设置数据视觉映射组件。
  • series 数组中定义了图表的系列配置,type: 'map' 表示绘制地图图表。
  • mapType: 'china' 设置地图类型为中国地图。
  • data 数组中包含了各个省份的数据。

案例二:世界地图的各国分布

2.1 准备工作

与世界地图案例不同的是,你需要下载世界地图的 JSON 数据。

2.2 代码实现

var myChart = echarts.init(document.getElementById('main'));

var option = {
    title: {
        text: '世界地图各国分布'
    },
    tooltip: {
        trigger: 'item'
    },
    visualMap: {
        min: 0,
        max: 100,
        left: 'left',
        top: 'bottom',
        text: ['高','低'],
        calculable: true
    },
    series: [
        {
            name: '世界',
            type: 'map',
            mapType: 'world',
            roam: true,
            label: {
                show: true
            },
            data: [
                {name: 'China', value: Math.round(Math.random() * 1000)}
                // ... 其他国家
            ]
        }
    ]
};

myChart.setOption(option);

2.3 代码解析

与世界地图案例类似,只需将 mapType 设置为 'world',并修改 data 数组中的国家名称和值即可。

案例三:自定义地图

3.1 准备工作

自定义地图需要自己绘制地图的 SVG 路径,并将其转换为 ECharts 支持的 JSON 格式。

3.2 代码实现

var myChart = echarts.init(document.getElementById('main'));

var option = {
    title: {
        text: '自定义地图'
    },
    tooltip: {
        trigger: 'item'
    },
    visualMap: {
        min: 0,
        max: 100,
        left: 'left',
        top: 'bottom',
        text: ['高','低'],
        calculable: true
    },
    series: [
        {
            name: '自定义地图',
            type: 'map',
            mapType: 'custom',
            roam: true,
            label: {
                show: true
            },
            data: [
                {name: '区域1', value: Math.round(Math.random() * 1000)},
                {name: '区域2', value: Math.round(Math.random() * 1000)}
                // ... 其他区域
            ],
            // 自定义地图路径
            geoCoordMap: {
                '区域1': [116.391285, 39.907654],
                '区域2': [121.473701, 31.230416]
                // ... 其他区域的经纬度
            }
        }
    ]
};

myChart.setOption(option);

3.3 代码解析

  • mapType: 'custom' 设置地图类型为自定义地图。
  • geoCoordMap 对象中定义了各个区域的经纬度。

案例四:热力地图

4.1 准备工作

热力地图需要准备经纬度数据以及对应的数值数据。

4.2 代码实现

var myChart = echarts.init(document.getElementById('main'));

var option = {
    title: {
        text: '热力地图'
    },
    tooltip: {
        trigger: 'item'
    },
    visualMap: {
        min: 0,
        max: 100,
        left: 'left',
        top: 'bottom',
        text: ['高','低'],
        calculable: true
    },
    series: [
        {
            name: '热力地图',
            type: 'heatmap',
            coordinateSystem: 'geo',
            data: [
                [116.391285, 39.907654, Math.round(Math.random() * 1000)],
                [121.473701, 31.230416, Math.round(Math.random() * 1000)]
                // ... 其他点的经纬度和数值
            ]
        }
    ]
};

myChart.setOption(option);

4.3 代码解析

  • type: 'heatmap' 设置图表类型为热力地图。
  • coordinateSystem: 'geo' 设置坐标系统为地理坐标系。

案例五:地图上的折线图

5.1 准备工作

地图上的折线图需要准备经纬度数据、数值数据以及折线图的数据。

5.2 代码实现

var myChart = echarts.init(document.getElementById('main'));

var option = {
    title: {
        text: '地图上的折线图'
    },
    tooltip: {
        trigger: 'item'
    },
    visualMap: {
        min: 0,
        max: 100,
        left: 'left',
        top: 'bottom',
        text: ['高','低'],
        calculable: true
    },
    series: [
        {
            name: '地图上的折线图',
            type: 'lines',
            coordinateSystem: 'geo',
            data: [
                [
                    [116.391285, 39.907654],
                    [121.473701, 31.230416]
                ]
                // ... 其他折线图的数据
            ],
            lineStyle: {
                normal: {
                    width: 1,
                    opacity: 0.6,
                    curveness: 0.2
                }
            }
        },
        {
            name: '点',
            type: 'effectScatter',
            coordinateSystem: 'geo',
            data: [
                [116.391285, 39.907654, Math.round(Math.random() * 1000)],
                [121.473701, 31.230416, Math.round(Math.random() * 1000)]
                // ... 其他点数据
            ],
            symbolSize: function (val) {
                return val / 10;
            },
            showEffectOn: 'render',
            rippleEffect: {
                brushType: 'stroke'
            },
            hoverAnimation: true,
            label: {
                normal: {
                    formatter: '{b}',
                    position: 'right',
                    show: true
                }
            },
            itemStyle: {
                normal: {
                    color: '#f4e925',
                    shadowBlur: 10,
                    shadowColor: '#333'
                }
            },
            zlevel: 1
        }
    ]
};

myChart.setOption(option);

5.3 代码解析

  • type: 'lines' 设置图表类型为折线图。
  • type: 'effectScatter' 设置图表类型为带有动画效果的散点图。

通过以上5个案例,相信你已经掌握了使用 ECharts 画出酷炫地图图表的基本技巧。在实际应用中,你可以根据自己的需求,对这些案例进行修改和扩展。祝你在数据可视化领域取得更好的成绩!