Skip to content

用ECharts画一张用户分布地图,运营看了直呼内行

做数据可视化,ECharts 是国内绕不开的库,免费、强大、文档全。这篇教你用 ECharts 的中国地图,把用户地域分布画出来。

效果就是那种"一张中国地图,每个省颜色深浅不同"的经典图。做完发给运营,对方一句"这数据哪来的",你就赢了。

数据从哪来

老规矩,先从访问日志抽IP,批量查归属地,按省聚合。IP9返回里有 prov(省份),直接用它分组最方便:

python
import requests
from collections import Counter

def query_prov(ip):
    try:
        r = requests.get(f"https://ip9.com.cn/get?ip={ip}", timeout=3)
        d = r.json()
        if d.get("ret") == 200:
            p = d["data"].get("prov")
            return p if p else "海外"
    except Exception:
        pass
    return None

# 日志里的IP -> 省份计数
prov_counter = Counter()
for ip in ip_list:
    prov_counter[query_prov(ip)] += 1

注意海外用户的 prov 是空的,归到"海外"一类,别漏。

用 ECharts 画中国地图

ECharts 5 之后,中国地图需要单独引入 geo 数据(或者用注册地图的方式)。最简单的方式是用 echarts + china.json 地图文件。

html
<div id="chart" style="width: 100%; height: 600px;"></div>
<script src="https://cdn.jsdelivr.net/npm/echarts@5/dist/echarts.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/echarts@5/map/js/china.js"></script>

然后配一个 map 图:

js
const chart = echarts.init(document.getElementById('chart'));

// 省份数据,例如 {"广东": 1234, "北京": 567, ...}
const data = [];   // [{name: '广东', value: 1234}, ...]
for (const [prov, value] of Object.entries(provData)) {
  data.push({ name: prov, value });
}

chart.setOption({
  tooltip: {
    trigger: 'item',
    formatter: (p) => `${p.name}<br/>访问量: ${p.value ?? 0}`
  },
  visualMap: {
    min: 0, max: Math.max(...data.map(d => d.value)),
    left: 'left', text: ['高', '低'],
    inRange: { color: ['#e0f3ff', '#1890ff', '#0050b3'] }
  },
  series: [{
    type: 'map',
    map: 'china',
    roam: true,
    label: { show: true, fontSize: 10 },
    data: data
  }]
});

visualMap 就是那个"颜色渐变条",值越大颜色越深,一眼看出用户集中在哪。

几个细节

1. 地区名要跟地图对得上

ECharts 的中国地图用的省份名是"广东""北京"这种标准名。IP9返回的 prov 一般就是标准名,直接能用。但如果遇到"内蒙古"之类有全称简称差异的,做个映射表兜底:

js
const nameMap = { '内蒙古': '内蒙古', '广西': '广西', '新疆': '新疆' };

2. 海外用户单独处理

中国地图画不了海外,把海外聚合数放旁边,加个总数显示:

js
document.getElementById('overseas').textContent = overseasCount;

3. 数据量小的时候

用户量少,别画地图(全是空的没意义),用柱状图更直观。地图适合用户分布"有明显集中"的时候。

进阶:点击省份下钻

运营可能会问"广东的用户都在哪些城市?"这时可以做下钻——点击省份,跳到该省城市级地图。逻辑是:再查一次"该省的城市分布",重新渲染地图。

这个功能不难,但别一上来就做,先把"省级总览"跑通,再按需加。

最后

一套下来,你就有了一张会说话的图。数据 + 地图 + 一点图表审美,比几十页PPT都管用。运营看到这种图,第一反应都是"快给我也来一份"。

批量查IP的接口:https://www.ip9.com.cn