之前上网发现一个好玩的在线工具:中国制霸生成器,可以标记去过的地方,制作自己的足迹地图。
但这个工具只能标记省级行政区,有些颗粒度太粗,比如去过郫县,在地图上就会体现为去过四川。于是想看看有其他工具没有。然后发现 Pyecharts 可以绘制地图,设置一下就能生成足迹地图,而且生成的是可以交互的地图 html 文件,不是图片。如果想要图片进行分享,截个图就 OK。
Pyecharts是个Python的绘图库,除了地图,还能绘制其他很多类型的可视化图像,具体可参考Pyechart官网。
下面讲足迹地图的绘制方法。
首先要有 Python 环境,安装方法网上很多,建议用 Anaconda。
然后安装Pyecharts
库,终端中运行以下命令:
pip install pyecharts
最后运行后文的 Python 代码生成足迹地图,生成的示例见下图。
使用注意:
.py
文件中,修改a_dict
中对应的城市名称,然后终端执行该.py
文件,或者直接在 Jupyter Notebook 中运行代码;我的足迹地图.html
文件,需要在联网状态下打开就能看到足迹地图。如果输入的城市名称有误,即不符合 Pyecharts 地图中的名称,终端中会显示提示,不会生成地图,需要更改后重新运行;all_china_city
,包含地图中全部的中国的地级市、自治州、海南省的自治县、台湾省的名称;pythonfrom pyecharts.charts import Map
from pyecharts import options as opts
import random
import os
# 在下面字典中输入对应的城市名称
a_dict = {
'居住': [
'北京市',
'西安市',
'西宁市',
'安康市',
],
'短居': [
'成都市',
'资阳市',
],
'游玩': [
'重庆市',
'海南藏族自治州',
'南京市',
'海北藏族自治州',
'兰州市',
'酒泉市',
'嘉峪关市',
'长沙市',
'湘西土家族苗族自治州',
'张家界市',
'广州市',
'杭州市',
'嘉兴市',
'秦皇岛市',
'南充市',
'宝鸡市',
'眉山市',
'泸州市',
'金华市',
],
'出差': [
'贵阳市',
'遵义市',
'洛阳市',
'黄冈市',
'南通市',
'常州市',
'无锡市',
'泰州市',
'海西蒙古族藏族自治州',
'南宁市',
'榆林市',
'渭南市',
'咸阳市',
'延安市',
'梧州市',
'上海市',
'淮北市',
'连云港市',
'沧州市',
'盘锦市',
'苏州市',
],
'路过': [
'武汉市',
'郑州市',
'徐州市',
'锦州市',
'达州市',
'汉中市',
'广元市',
'绵阳市',
'宜宾市',
'海东市',
'铜川市',
'保定市',
'石家庄市',
'天水市',
'滁州市',
'三门峡市',
'太原市',
'天津市',
'唐山市',
'遂宁市',
'张掖市',
'武威市',
]
}
# 以下是与地图对应的全国全部地级市、自治州、台湾省、海南自治县的名称
all_china_city = [
"阿坝藏族羌族自治州",
"阿克苏地区",
"阿拉善盟",
"阿勒泰地区",
"阿里地区",
"安康市",
"安庆市",
"安顺市",
"安阳市",
"鞍山市",
"澳门特别行政区",
"巴彦淖尔市",
"巴音郭楞蒙古自治州",
"巴中市",
"白城市",
"白山市",
"白银市",
"百色市",
"蚌埠市",
"包头市",
"宝鸡市",
"保定市",
"保山市",
"北海市",
"北京市",
"本溪市",
"毕节市",
"滨州市",
"亳州市",
"沧州市",
"昌都市",
"昌吉回族自治州",
"常德市",
"常州市",
"朝阳市",
"潮州市",
"郴州市",
"成都市",
"承德市",
"池州市",
"赤峰市",
"重庆市",
"崇左市",
"滁州市",
"楚雄彝族自治州",
"达州市",
"大理白族自治州",
"大连市",
"大庆市",
"大同市",
"丹东市",
"儋州市",
"德宏傣族景颇族自治州",
"德阳市",
"德州市",
"迪庆藏族自治州",
"定西市",
"东莞市",
"东营市",
"鄂尔多斯市",
"鄂州市",
"恩施土家族苗族自治州",
"防城港市",
"佛山市",
"福州市",
"抚顺市",
"抚州市",
"阜新市",
"阜阳市",
"甘南藏族自治州",
"甘孜藏族自治州",
"赣州市",
"固原市",
"广安市",
"广元市",
"广州市",
"贵港市",
"贵阳市",
"桂林市",
"果洛藏族自治州",
"哈尔滨市",
"哈密市",
"海北藏族自治州",
"海东市",
"海口市",
"海南藏族自治州",
"海西蒙古族藏族自治州",
"邯郸市",
"汉中市",
"杭州市",
"合肥市",
"和田地区",
"河池市",
"河源市",
"菏泽市",
"贺州市",
"鹤壁市",
"鹤岗市",
"黑河市",
"衡水市",
"衡阳市",
"红河哈尼族彝族自治州",
"呼和浩特市",
"呼伦贝尔市",
"湖州市",
"葫芦岛市",
"怀化市",
"淮安市",
"淮北市",
"淮南市",
"黄冈市",
"黄南藏族自治州",
"黄山市",
"黄石市",
"惠州市",
"鸡西市",
"吉安市",
"吉林市",
"济南市",
"济宁市",
"佳木斯市",
"嘉兴市",
"嘉峪关市",
"江门市",
"焦作市",
"揭阳市",
"金昌市",
"金华市",
"锦州市",
"晋城市",
"晋中市",
"荆门市",
"荆州市",
"景德镇市",
"九江市",
"酒泉市",
"喀什地区",
"开封市",
"克拉玛依市",
"昆明市",
"拉萨市",
"来宾市",
"兰州市",
"廊坊市",
"乐山市",
"丽江市",
"丽水市",
"连云港市",
"辽阳市",
"辽源市",
"聊城市",
"林芝市",
"临沧市",
"临汾市",
"临夏回族自治州",
"临沂市",
"柳州市",
"六安市",
"六盘水市",
"龙岩市",
"陇南市",
"娄底市",
"泸州市",
"吕梁市",
"洛阳市",
"漯河市",
"马鞍山市",
"茂名市",
"眉山市",
"梅州市",
"绵阳市",
"牡丹江市",
"那曲市",
"南昌市",
"南充市",
"南京市",
"南宁市",
"南平市",
"南通市",
"南阳市",
"内江市",
"宁波市",
"宁德市",
"怒江傈僳族自治州",
"攀枝花市",
"盘锦市",
"平顶山市",
"平凉市",
"萍乡市",
"莆田市",
"濮阳市",
"普洱市",
"七台河市",
"齐齐哈尔市",
"黔东南苗族侗族自治州",
"黔南布依族苗族自治州",
"黔西南布依族苗族自治州",
"钦州市",
"秦皇岛市",
"青岛市",
"清远市",
"庆阳市",
"曲靖市",
"衢州市",
"泉州市",
"日喀则市",
"日照市",
"三门峡市",
"三明市",
"三沙市",
"三亚市",
"厦门市",
"山南市",
"山彝族自治州",
"汕头市",
"汕尾市",
"商洛市",
"商丘市",
"上海市",
"上饶市",
"韶关市",
"邵阳市",
"绍兴市",
"深圳市",
"沈阳市",
"十堰市",
"石家庄市",
"石嘴山市",
"双鸭山市",
"朔州市",
"四平市",
"松原市",
"苏州市",
"宿迁市",
"宿州市",
"绥化市",
"随州市",
"遂宁市",
"塔城地区",
"台州市",
"太原市",
"泰安市",
"泰州市",
"唐山市",
"天津市",
"天水市",
"铁岭市",
"通化市",
"通辽市",
"铜川市",
"铜陵市",
"铜仁市",
"吐鲁番市",
"威海市",
"潍坊市",
"渭南市",
"温州市",
"乌海市",
"乌兰察布市",
"乌鲁木齐市",
"无锡市",
"吴忠市",
"芜湖市",
"梧州市",
"武汉市",
"武威市",
"西安市",
"西宁市",
"西双版纳傣族自治州",
"锡林郭勒盟",
"咸宁市",
"咸阳市",
"香港特别行政区",
"湘潭市",
"湘西土家族苗族自治州",
"襄阳市",
"孝感市",
"忻州市",
"新乡市",
"新余市",
"信阳市",
"邢台市",
"兴安盟市",
"徐州市",
"许昌市",
"宣城市",
"雅安市",
"烟台市",
"延安市",
"延边朝鲜族自治州",
"盐城市",
"扬州市",
"阳江市",
"阳泉市",
"伊春市",
"伊犁哈萨克自治州",
"宜宾市",
"宜昌市",
"宜春市",
"益阳市",
"银川市",
"鹰潭市",
"营口市",
"永州市",
"榆林市",
"玉林市",
"玉树藏族自治州",
"玉溪市",
"岳阳市",
"云浮市",
"运城市",
"枣庄市",
"湛江市",
"张家界市",
"张家口市",
"张掖市",
"漳州市",
"长春市",
"长沙市",
"长治市",
"昭通市",
"肇庆市",
"镇江市",
"郑州市",
"中山市",
"中卫市",
"舟山市",
"周口市",
"株洲市",
"珠海市",
"驻马店市",
"壮族苗族自治州",
"资阳市",
"淄博市",
"自贡市",
"遵义市",
"大兴安岭地区",
"兴安盟",
"济源市",
"神农架林区",
"天门市",
"仙桃市",
"潜江市",
"凉山彝族自治州",
"文山壮族苗族自治州",
"克孜勒苏柯尔克孜自治州",
"图木舒克市",
"阿拉尔市",
"昆玉市",
"铁门关市",
"博尔塔拉蒙古自治州",
"可克达拉",
"双河市",
"胡杨河市",
"石河子市",
"五家渠市",
"北屯市",
"台湾省",
"临高县",
"澄迈县",
"文昌市",
"屯昌县",
"安定县",
"琼海市",
"万宁市",
"陵水黎族自治县",
"琼中黎族苗族自治县",
"保亭黎族苗族自治县",
"白沙黎族自治县",
"五指山市",
"乐东黎族自治县",
"昌江黎族自治县",
"东方市",
]
# 一个列表用来存储输入不准确的城市名称
a_log = []
# 一个列表用来存储去过的全部城市名称
have_go = []
for key in a_dict:
for i in a_dict[key]:
if i not in all_china_city:
a_log.append(i)
else:
have_go.append(i)
# 判定城市名称如果输入不准确,则给出提示,结束程序
if len(a_log) != 0:
print('以下城市名称输入有误:')
print(a_log)
os._exit()
# 生成没去过的城市名称列表
no_go = list(set(all_china_city) - set(have_go))
# 生成(城市名称, 数值)的元组列表,数值随意但须与下面分段图列的范围匹配
a1 = list((x, 280) for x in a_dict['居住'])
a2 = list((x, 230) for x in a_dict['短居'])
a3 = list((x, 180) for x in a_dict['游玩'])
a4 = list((x, 130) for x in a_dict['出差'])
a5 = list((x, 80) for x in a_dict['路过'])
a6 = list((x, 30) for x in no_go)
data_city = a1 + a2 + a3 + a4 + a5 + a6
# 生成图列名称
label1 = '居住 ' + str(len(a1))
label2 = '短居 ' + str(len(a2))
label3 = '游玩 ' + str(len(a3))
label4 = '出差 ' + str(len(a4))
label5 = '路过 ' + str(len(a5))
# 图列分段
a_pieces = [
{'min': 250, 'label': label1, 'color': '#F47983'},
{'min': 200, 'max': 250, 'label': label2, 'color': '#B36D61'},
{'min': 150, 'max': 200, 'label': label3, 'color': '#177CB0'},
{'min': 100, 'max': 150, 'label': label4, 'color': '#549688'},
{'min': 50, 'max': 100, 'label': label5, 'color': '#3DE1AD'},
{'max': 50, 'label': '没去过', 'color': '#FFFBF0'}
]
# 生成地图,保存为文件"我的足迹地图.html"
china_city = (
Map(init_opts=opts.InitOpts(width = '1200px', height='600px'))
.add(
"",
data_city,
"china-cities",
is_map_symbol_show=False,
label_opts=opts.LabelOpts(is_show=False),
zoom=1.4,
center=[109.02, 32.7]
)
.set_global_opts(
title_opts=opts.TitleOpts(title="我的足迹地图"),
visualmap_opts=opts.VisualMapOpts(
is_piecewise=True,
pieces=a_pieces,
# border_color='#FCEFE8',
),
)
.render("我的足迹地图.html")
)
本文作者:tsingk
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!