上次是对微信好友的性别进行了统计分析,接下来将要对其位置分布做可视化显示,看看我的好友所在城市分布有何规律~
从 v0.3.2 开始,为了缩减项目本身的体积以及维持 pyecharts 项目的轻量化运行,pyecharts 将不再自带地图 js 文件,因此我们需要自行安装地图扩展包,大概是以下这些:
当然也不用全部安装,按自己的需求吧,
echarts-countries-pypkg:即世界地图,包括213 个国家
echarts-china-provinces-pypkg:即中国省级地图,包括23 个省,5 个自治区
echarts-china-cities-pypkg:即中国市级地图:,包括370 个中国城市
echarts-china-counties-pypkg:即中国县区级地图,包括2882 个中国县或区
echarts-china-misc-pypkg:即中国区域地图,包括11 个中国区域地图,比如西南,华北等。
echarts-united-kingdom-pypkg:即英国2016选区图,可以用来显示与政治经济相关的数据
还有一个 echarts-cities-pypkg,这个包里面都是一些全球区域内的地点和经纬度的映射,类似[{'area':[longitude,latitude]}]这种形式,大千世界,地名难免有相同的,特别是一些县区级以下的地名;该包就是帮助我们检索一些在之前的几个地图包中没有而我我们所需要的地名。在该包中你可以看到10k+个地点,可以用ctrl+F来搜索你感兴趣的地点,另外这个包里面的地点都是英文命名的,我没有安装这个包,感觉以上几个足够了。。
然后上代码吧:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# 导入Counter类,用于统计值出现的次数
from collections import Counter
# 导入Geo组件,用于生成地理坐标类图
from pyecharts import Geo
import json
# 导入Bar组件,用于生成柱状图
from pyecharts import Bar
# 处理地名数据,解决坐标文件中找不到地名的问题
def handle(cities):
# 获取坐标文件中所有地名
data = None
with open(
'E:/Program Files (x86)/pythonworkspace/hello/venv/Lib/site-packages/pyecharts/datasets/city_coordinates.json',
mode='r', encoding='utf-8') as f: #坐标文件所在目录
data = json.loads(f.read()) # 将str转换为json
# 循环判断处理
data_new = data.copy() # 拷贝所有地名数据
for city in set(cities): # 使用set去重
# 处理地名为空的数据
if city == '':
while city in cities:
cities.remove(city)
count = 0
for k in data.keys():
count += 1
if k == city:
break
if k.startswith(city): # 处理简写的地名,如 达州市 简写为 达州
# print(k, city)
data_new[city] = data[k]
break
if k.startswith(city[0:-1]) and len(city) >= 3: # 处理行政变更的地名,如县改区 或 县改市等
data_new[city] = data[k]
break
# 处理不存在的地名
if count == len(data):
while city in cities:
cities.remove(city)
# 写入覆盖坐标文件
with open(
'E:/Program Files (x86)/pythonworkspace/hello/venv/Lib/site-packages/pyecharts/datasets/city_coordinates.json',
mode='w', encoding='utf-8') as f:
f.write(json.dumps(data_new, ensure_ascii=False)) # 将json转换为str
# 数据可视化
def render():
# 获取所有城市
cities = []
with open('friends.txt', mode='r', encoding='utf-8') as f:
rows = f.readlines()
for row in rows:
city = row.split(',')[4]
if city != '': # 去掉城市名为空的值
cities.append(city)
# 对城市数据和坐标文件中的地名进行处理
handle(cities)
# 统计每个城市出现的次数
data = Counter(cities).most_common() # 使用Counter类统计出现的次数,并转换为元组列表
print(data)
# 根据城市数据生成地理坐标图
geo = Geo('好友位置分布', '', title_color='#fff', title_pos='center', width=1200, height=600,
background_color='#404a59')
attr, value = geo.cast(data)
geo.add('', attr, value, visual_range=[0, 40],#设置显示范围
type="effectScatter", is_random=True, effect_scale=3,#散点特效
visual_text_color='#fff', symbol_size=15,
is_visualmap=True, is_piecewise=True)
geo.render('好友位置分布.html')
# 根据城市数据生成柱状图
data_top25 = Counter(cities).most_common(25) # 返回出现次数最多的25条
bar = Bar('好友所在城市TOP25', '', title_pos='center', width=1200, height=600)
attr, value = bar.cast(data_top25)
bar.add('', attr, value, is_visualmap=True, visual_text_color='#fff', is_more_utils=True,
is_label_show=True)
bar.render('好友所在城市TOP25.html')
if __name__ == '__main__':
render()
一开始只有render()方法,结果出了问题:
该问题主要是坐标文件和好友设置的地名不一致所造成的,比如上述的“海淀”,在坐标中心应为“海淀区”,为了消除这一差异,我们引入了handle()方法,我查了下资料,对于这一块还有很多方法,我们可以尝试map和geo以及自定义区域,对于小体量的数据效果还是挺不错的~~
当然一开始还有点错误,忘了安装pyecharts-snapshot插件
该插件可用于保存各种照片形式:
看下最后的效果图吧:
用到了散点特效,看着有点乱,动态效果还是挺不错的。。很明显能看出我的好友基本上是在东部沿海区域,人数最多的是在四川,因为我现在正在成都读书,可以更加确切地显示我的好友分布最多的25个城市:
我一共285个好友,有一部分没有标记所在城市,前三名正是我研究生本科以及家乡所在地,真的是这样,读书工作以及家乡的大圈子是我们接触最多的,希望以后能认识更多志同道合的朋友吧。