原来炫酷的可视化地图,用Python就能搞定!
对于可视化地图,Pyecharts是小F以前用的最多的。
还有应该就是一些网站了,现成的工具,不需要敲代码。
在5G手机可视化那一篇文章,也是用Pyecharts做的地图~
![](https://filescdn.proginn.com/27ec69ab0c804745d4090e68fb66b665/353fd1e1d7bddb2cede626baa4ab0fde.webp)
而对于Matplotlib,目前小F还没有使用它绘制过地图。
所以在查阅相关资料的时候,又发现了大佬造的轮子。
Python+Selenium+Matplotlib,实现中国地图可视化。
地图数据来源于民政部,真实可靠。
项目地址:https://gitee.com/jixuanfan/Map-of-China
![](https://filescdn.proginn.com/f74125e01e9fcf8e24ce25d02a7b1ff0/0803941f7b44b112a2eb0a49c10d4a06.webp)
由于小F之前一直用「GitHub」保存代码,压根就没有注册「Gitee」。
而作者的代码以及相关数据是上传到「Gitee」上,需要注册下载。
不想注册那么多账号,所以查了一下在不登录情况下,能否下载项目代码。
CURL,是一个利用URL语法在命令行下工作的文件传输工具。
# 在仓库地址(https://gitee.com/jixuanfan/Map-of-China)
# 后面拼接/repository/archive/master.zip
# 下载本例项目代码
curl -o data.zip https://gitee.com/jixuanfan/Map-of-China/repository/archive/master.zip
Windows或许需要安装,那还是老老实实注册账号,然后下载项目代码。
Mac和Linux应该都是内置CURL,直接使用命令就行,无需安装。
/ 01 / 地图数据获取
Get_Map,基于Python爬虫,主要用到Selenium+正则。
Selenium是一个用于测试网站的自动化测试工具,这里我们主要是用它来模拟浏览器操作,进而获取地图数据。
安装教程网上都有,推荐使用谷歌浏览器,驱动文件和浏览器版本需一致。
获取地图数据的两个接口地址。
# 首页URL,获取当前所有行政区划的代码
http://xzqh.mca.gov.cn/map
# 查询URL,获取国家或省市的具体地图数据
http://xzqh.mca.gov.cn/defaultQuery?
首先是获取行政区划的代码,最小应该是到县一级。
绘制不同类型的地图,所需要的数据获取函数如下。
行政代码不清楚,网上查询一下就好咯~
import Map_of_China as Map
# 创建获取地图数据对象
M=Map.Get_Map()
# 获取首页全国各省的地图数据
M.Get_country()
# 获取一组省份内各地级行政区划的数据
M.Get_provinces([32,43])
# 自动获取全国尚未获取的省份数据
M.Get_provinces_auto()
# 获取一组地级市内各县级行政区划的数据
M.Get_cities([3201,3203])
# 自动获取某个省尚未获取的县级行政区划数据
M.Get_cities_auto(32)
# 获取全国所有县级行政区划的数据(合并在一张地图中)
M.Get_country_county()
数据主要包括形状、形状颜色、形状轮廓、文字、文字位置、标注点形状、标注点位置等。
![](https://filescdn.proginn.com/ed8573b7c4ef1b45bf0f94af1a687a5d/725e81486d5ff558ffb7d562a85c3b48.webp)
具体爬取代码、数据解析及函数的相关参数,查看Map_of_China.py文件可知。
/ 02 / 地图数据呈现
Draw_Map,基于Matplotlib绘制地图。
01. 绘制省/地级/县级行政区划的轮廓
import Map_of_China as Map
# 创建获取地图数据对象
M = Map.Get_Map()
# 创建绘制地图对象
D = Map.Draw_Map()
# #获取首页全国各省的地图数据
M.Get_country()
# 江苏地图
D.Draw_single_shape('Data/Country/320000.txt', LC=[116, 169, 221],
FC=[96, 139, 219], BC='w', lw=2, title='江苏轮廓',
img_path='jiansu.jpg')
# 获取各省份内各地级行政区划的数据
M.Get_provinces([32])
# 南京地图
D.Draw_single_shape('Data/Province/32-江苏/320100.txt', LC='k', FC=None,
title='南京轮廓', img_path='nanjing.jpg')
得到结果如下。
![](https://filescdn.proginn.com/f58a4909e5a8221418899c8cc2d2559d/b5485d5a99930dc08c819103709a45fc.webp)
![](https://filescdn.proginn.com/ba98fae90797cedc70a22c1c0a1f518e/360df05bcc83d7f6436bc799c6477d02.webp)
函数可设置的参数,有线条、填充、背景颜色,以及线宽、标题、图片保存路径等。
![](https://filescdn.proginn.com/2e201a59f14a1a23761e5f825d495f48/2689201cabcca10f9b57aae64086f28e.webp)
02. 绘制全国地图
import Map_of_China as Map
# 创建获取地图数据对象
M = Map.Get_Map()
# 创建绘制地图对象
D = Map.Draw_Map()
# 绘制全国地图
D.Draw_country(FC=True, img_path='china.jpg', arg={'provName': False,
'city_name': True, 'city_pos': True, 'sea': False}, title='中国地图')
因为前面已经把全国的地图数据爬取下来,所以这里就省去了下载数据的代码。
得到结果如下。
![](https://filescdn.proginn.com/b5a81eccd7d6b0640422a71c4f28ee7e/750e6b588371fef63dcbe70c51a0b840.webp)
配色方案,默认设置为民政部官网上的配色。
![](https://filescdn.proginn.com/4e82e8218fb0384229c47fa47fdb186b/606e6e332f49a17ae84632a9f62fe251.webp)
有一些参数和轮廓图相同,不过也添加了一些新的参数。
比如南海地图位置,显示省份名称,省份名称颜色等。
03. 绘制省份地图
import Map_of_China as Map
# 创建获取地图数据对象
M = Map.Get_Map()
# 获取广东省份内各地级行政区划的数据
M.Get_provinces([44])
# 创建绘制地图对象
D = Map.Draw_Map()
# 绘制广东省地图
D.Draw_province('广东', FC=True, LC='w', arg={'other': True, 'city_pos': True, 'city_name': True},
img_path='guangdong.jpg')
对于省份数据,前面小F只爬取了江苏省,所以这里需要爬取广东省的地图数据才行。
得到结果如下。
![](https://filescdn.proginn.com/312901a38ae0bfaf3f13223ff43e619c/1fd91a92b2c19c357572e93685b5e99a.webp)
绘制省份地图函数对应的参数有。
![](https://filescdn.proginn.com/5c8e8836d7e1f941f25d016d6eb57dee/dda9029262ca97593ed04b40ffeef937.webp)
code可为省份的2位编码或者名称,此处设置为「广东」。
函数还包含绘制热力图的参数,data和by_val。
arg中的other设置为False时,表现不显示周围省份或城市的地图,默认参数为True,即显示。
![](https://filescdn.proginn.com/e9484a58850c19d35421544a72b51915/8b6193a721171af9ba2dfa6abb635139.webp)
04. 地级行政单位地图
import Map_of_China as Map
# 创建获取地图数据对象
M = Map.Get_Map()
# 获取南京、深圳行政区划的数据
M.Get_cities([3201, 4403])
# 创建绘制地图对象
D = Map.Draw_Map()
# 南京地图(默认样式)
D.Draw_city('3201', img_path='nanjing_city.jpg')
# 深圳地图(自定义样式)
D.Draw_city('深圳', FC=True, LC='w', arg={'other': True, 'city_pos': True, 'city_name': True},
img_path='shenzhen.jpg')
得到结果如下。
![](https://filescdn.proginn.com/b044639aa2b128efa0dc6320d44ede5d/28a9aec7751bb2325626de7b508d1e4d.webp)
![](https://filescdn.proginn.com/8f082b07f45632c0464189863b78d8ad/793770ff39a7d39584bf6c5d7d75905d.webp)
此处code为地级市的四位编码。
![](https://filescdn.proginn.com/f1df93b8069e958524cc2de3bc42a605/475206c85276d077cbba1d9bf089f84a.webp)
import Map_of_China as Map
# 创建获取地图数据对象
M = Map.Get_Map()
# 创建绘制地图对象
D = Map.Draw_Map()
# 文件路径
src = 'Example/GDP-2018.csv'
# 按数据的相对大小(排名)显示
D.Show_data(src, by_val=False, arg={'default_color': [0.6, 0.6, 0.6], 'sea': False},
img_path='gdp.jpg', title='2018年各省市GDP')
得到结果如下。
![](https://filescdn.proginn.com/97ee4244af9ab901ae517a1e47600433/6eb148cbd768af356d0e62f4da9216af.webp)
CSV文件具体内容格式如下。
![](https://filescdn.proginn.com/419f49594cae5e6db710e02b5ff676b5/21146318db05312a16a19b1650194636.webp)
第一列为区域名称或者编码,第二列为数值。
数据处理模块在Map_of_China.py文件中。
![](https://filescdn.proginn.com/533c04b54ede6c6f2057d73c1391649b/ff95e8ff55a9b22d66e35399861adf82.webp)
参数by_val,绝对大小和相对大小,通常应该都会选择绝对大小这种方式展示的。
就是作者的这个热力图,是没有图例的,等待更新~
# 省级数据
D.Show_data('Example/江苏人口2018.txt', '32', by_val=True, title='江苏人口2018',
img_path='jiangsu_2018_1.jpg')
# 配置地图中的样式
D.Show_data('Example/江苏人口2018.txt', '32', by_val=True, LC='w', title='江苏人口2018',
arg={'city_name': True, 'city_pos': True, 'other': True},
img_path='jiangsu_2018_2.jpg')
TXT格式的数据也能使用。
![](https://filescdn.proginn.com/b5fbfba2710c3421ba03cd8049329e68/97f8ef73c7ba14ba35d549c4fec01112.webp)
![](https://filescdn.proginn.com/630cea57e9444bf810c18149fbb48c76/11d197f27b1c473442e8515fd895262a.webp)
![](https://filescdn.proginn.com/6c3f9398a547694db1243150056fb156/725df040dba26371a77fae1596bed7f0.webp)
06. 绘制气泡图
# 气泡图
D.Bubble(src='Example/GDP-2018.csv', title='2018年各省市GDP', img_path='GDP_bubble.png')
得到结果如下。
![](https://filescdn.proginn.com/14447f47efadf5dd41aa358e0cc9457b/81f0ae648879fe2feafbfb1218e4b5ad.webp)
气泡颜色默认为黄色,可自定义参数。
![](https://filescdn.proginn.com/c4c2a43dfeb73324d74b8f37d22c422f/a44f93f5455379bb5b803c7f8f4fe308.webp)
发现和Pyecharts好像,相信在修改地图配色、文本字体及位置后,地图会变得更好看!
不过限于时间,下期小F再来说一说~
![](https://filescdn.proginn.com/e868bdab1f045f3333dd3665f53df831/65b09ff3af1d187dfe55538ff097848c.webp)
还有几个功能,坐等大佬更新~
相关代码及文件我已上传公众号,回复「地图」即可获取。
如此就不需要你自己注册账号,直接就能使用。
万水千山总是情,点个 👍 行不行。
··· END ···
推荐阅读:
Python中的高效迭代库itertools,排列组合随便求
万字长文详解|Python库collections,让你击败99%的Pythoner
↓扫描关注本号↓