用Python把图做的好看点:用Pyecharts做个交互地图(一)

2,432 阅读6分钟
原文链接: zhuanlan.zhihu.com

今天,老板又突发奇想,觉得光看excel表,很无聊,所以要把数据放到地图上去,所以我们今天来研究下,怎么在地图上画散点图,今天主要的内容就这样了

  • 用库里自带的地理信息画图
  • 异常情况处理

然后,第二期我们在研究下如何导入经纬度信息

今天我们换一个库,不翻Matplotlib 的牌子了,我们试试牛逼哄哄的Echarts python版本

首先我们来看看官方的例子

很牛逼,简简单的就能在地图上画上散点,还加上一个可以拉动的筛选条子

我们看看官方实例的代码:

from pyecharts import Geo

data = [
    ("海门", 9),("鄂尔多斯", 12),("招远", 12),("舟山", 12),("齐齐哈尔", 14),("盐城", 15),
    ("赤峰", 16),("青岛", 18),("乳山", 18),("金昌", 19),("泉州", 21),("莱西", 21),
    ("日照", 21),("胶南", 22),("南通", 23),("拉萨", 24),("云浮", 24),("梅州", 25),
    ("文登", 25),("上海", 25),("攀枝花", 25),("威海", 25),("承德", 25),("厦门", 26),
    ("汕尾", 26),("潮州", 26),("丹东", 27),("太仓", 27),("曲靖", 27),("烟台", 28),
    ("福州", 29),("瓦房店", 30),("即墨", 30),("抚顺", 31),("玉溪", 31),("张家口", 31),
    ("阳泉", 31),("莱州", 32),("湖州", 32),("汕头", 32),("昆山", 33),("宁波", 33),
    ("湛江", 33),("揭阳", 34),("荣成", 34),("连云港", 35),("葫芦岛", 35),("常熟", 36),
    ("东莞", 36),("河源", 36),("淮安", 36),("泰州", 36),("南宁", 37),("营口", 37),
    ("惠州", 37),("江阴", 37),("蓬莱", 37),("韶关", 38),("嘉峪关", 38),("广州", 38),
    ("延安", 38),("太原", 39),("清远", 39),("中山", 39),("昆明", 39),("寿光", 40),
    ("盘锦", 40),("长治", 41),("深圳", 41),("珠海", 42),("宿迁", 43),("咸阳", 43),
    ("铜川", 44),("平度", 44),("佛山", 44),("海口", 44),("江门", 45),("章丘", 45),
    ("肇庆", 46),("大连", 47),("临汾", 47),("吴江", 47),("石嘴山", 49),("沈阳", 50),
    ("苏州", 50),("茂名", 50),("嘉兴", 51),("长春", 51),("胶州", 52),("银川", 52),
    ("张家港", 52),("三门峡", 53),("锦州", 54),("南昌", 54),("柳州", 54),("三亚", 54),
    ("自贡", 56),("吉林", 56),("阳江", 57),("泸州", 57),("西宁", 57),("宜宾", 58),
    ("呼和浩特", 58),("成都", 58),("大同", 58),("镇江", 59),("桂林", 59),("张家界", 59),
    ("宜兴", 59),("北海", 60),("西安", 61),("金坛", 62),("东营", 62),("牡丹江", 63),
    ("遵义", 63),("绍兴", 63),("扬州", 64),("常州", 64),("潍坊", 65),("重庆", 66),
    ("台州", 67),("南京", 67),("滨州", 70),("贵阳", 71),("无锡", 71),("本溪", 71),
    ("克拉玛依", 72),("渭南", 72),("马鞍山", 72),("宝鸡", 72),("焦作", 75),("句容", 75),
    ("北京", 79),("徐州", 79),("衡水", 80),("包头", 80),("绵阳", 80),("乌鲁木齐", 84),
    ("枣庄", 84),("杭州", 84),("淄博", 85),("鞍山", 86),("溧阳", 86),("库尔勒", 86),
    ("安阳", 90),("开封", 90),("济南", 92),("德阳", 93),("温州", 95),("九江", 96),
    ("邯郸", 98),("临安", 99),("兰州", 99),("沧州", 100),("临沂", 103),("南充", 104),
    ("天津", 105),("富阳", 106),("泰安", 112),("诸暨", 112),("郑州", 113),("哈尔滨", 114),
    ("聊城", 116),("芜湖", 117),("唐山", 119),("平顶山", 119),("邢台", 119),("德州", 120),
    ("济宁", 120),("荆州", 127),("宜昌", 130),("义乌", 132),("丽水", 133),("洛阳", 134),
    ("秦皇岛", 136),("株洲", 143),("石家庄", 147),("莱芜", 148),("常德", 152),("保定", 153),
    ("湘潭", 154),("金华", 157),("岳阳", 169),("长沙", 175),("衢州", 177),("廊坊", 193),
    ("菏泽", 194),("合肥", 229),("武汉", 273),("大庆", 279)]

geo = Geo("全国主要城市空气质量", "data from pm2.5", 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, 200], visual_text_color="#fff",
        symbol_size=15, is_visualmap=True)
geo.render()

代码很简单:

data = [ ("海门", 9),("鄂尔多斯", 12)]

数据用列表,包着元组,地名用文本,应该地图自带了地名

geo = Geo("全国主要城市空气质量", "data from pm2.5", title_color="#fff",
          title_pos="center", width=1200,
          height=600, background_color='#404a59')

在geo里确定了标题,子标题,标题颜色,位置,大小,和背景颜色等,而且颜色用的#404a59,这种十六进制的表达方法,可以在网上找到专门的在线转换网站,把RBG值转换成这种十六进制。

具体可以看见官方对geo里参数的描述

attr, value = geo.cast(data)

这个应该是geo自带的数据格式转换方法,官方的文档里有写到

  • attr -> list
    属性名称
  • value -> list
    属性所对应的值

我们可以看到,cast把元组拆开了,成了两个list,attr列表里是地名,value列表里是值

geo.add("", attr, value, visual_range=[0, 200], visual_text_color="#fff",
        symbol_size=15, is_visualmap=True)

add里包括图中的细节部分,我就直接把官方的抄过来啦!!图例名称

  • attr -> list
    属性名称
  • value -> list
    属性所对应的值
  • type -> str
    图例类型,有'scatter', 'effectScatter', 'heatmap'可选。默认为 'scatter'
  • maptype -> str
    地图类型。 支持 china、world、安徽、澳门、北京、重庆、福建、福建、甘肃、广东,广西、广州、海南、河北、黑龙江、河南、湖北、湖南、江苏、江西、吉林、辽宁、内蒙古、宁夏、青海、山东、上海、陕西、山西、四川、台湾、天津、香港、新疆、西藏、云南、浙江,以及 363个二线城市地图。提醒:在画市级地图的时候,城市名字后面的‘市’要省去了,比如,石家庄市的‘市’不要提,即‘石家庄’就可以了。
  • symbol_size -> int
    标记图形大小。默认为 12
  • border_color -> str
    地图边界颜色。默认为 '#111'
  • geo_normal_color -> str
    正常状态下地图区域的颜色。默认为 '#323c48'
  • geo_emphasis_color -> str
    高亮状态下地图区域的颜色。默认为 '#2a333d'
  • geo_cities_coords -> dict
    用户自定义地区经纬度,类似如 {'阿城': [126.58, 45.32],} 这样的字典,当用于提供了该参数时,将会覆盖原有预存的区域坐标信息。
  • is_roam -> bool
    是否开启鼠标缩放和平移漫游。默认为 True
    如果只想要开启缩放或者平移,可以设置成'scale'或者'move'。设置成 True 为都开启

看上回去很简单啊,让我们亲自把自己的数据丢进去看看,首先安装包

pip install pyecharts 

然而,然而,然而~~~~

一切事情都没有那么顺利的!!!!!

为什么我显示不出地图呢~~~~????,

我们来解决第一个问题:为什么我显示不出地图背景!

让我们继续翻官方的文档,原来:新的库不带地图了,要自己安装,

pip install echarts-countries-pypkg
pip install echarts-china-provinces-pypkg
pip install echarts-china-cities-pypkg

好的,我们安装完后继续!

纳尼,

依旧显示不出来地图!~!~!

最后,经过我百般打探,试验,终于发现了解决方法!!!

把这三个包删除了,重新在安装一遍,吐血

好的我们,第一期教学完成,研究了官方的例子,然后我们下期尝试用自己的经纬度excel表和数据,然生成