2023-08-13
数据分析
00

之前上网发现一个好玩的在线工具:中国制霸生成器,可以标记去过的地方,制作自己的足迹地图。

但这个工具只能标记省级行政区,有些颗粒度太粗,比如去过郫县,在地图上就会体现为去过四川。于是想看看有其他工具没有。然后发现 Pyecharts 可以绘制地图,设置一下就能生成足迹地图,而且生成的是可以交互的地图 html 文件,不是图片。如果想要图片进行分享,截个图就 OK。

Pyecharts是个Python的绘图库,除了地图,还能绘制其他很多类型的可视化图像,具体可参考Pyechart官网

下面讲足迹地图的绘制方法。

首先要有 Python 环境,安装方法网上很多,建议用 Anaconda。

然后安装Pyecharts库,终端中运行以下命令:

pip install pyecharts

最后运行后文的 Python 代码生成足迹地图,生成的示例见下图。

使用注意:

  1. 可将代码复制进一个.py文件中,修改a_dict中对应的城市名称,然后终端执行该.py文件,或者直接在 Jupyter Notebook 中运行代码;
  2. 运行代码后,如果输入的城市名称无误的话,会在当前工作目录中生成我的足迹地图.html文件,需要在联网状态下打开就能看到足迹地图。如果输入的城市名称有误,即不符合 Pyecharts 地图中的名称,终端中会显示提示,不会生成地图,需要更改后重新运行;
  3. 输入地级市名称一定要加上「市」字,比如重庆市;
  4. 代码中的列表all_china_city,包含地图中全部的中国的地级市、自治州、海南省的自治县、台湾省的名称;
  5. 设置为地图中不显示地名,否则密密麻麻全是名字,生成的地图为可交互的,鼠标放在某地区就会显示城市名称。
python
from 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 许可协议。转载请注明出处!