Appearance
用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