分享一次自己使用 pyecharts 模块 画地图,一路踩坑和填坑的经历

您所在的位置:网站首页 pyecharts中国地图代码 分享一次自己使用 pyecharts 模块 画地图,一路踩坑和填坑的经历

分享一次自己使用 pyecharts 模块 画地图,一路踩坑和填坑的经历

2024-07-03 17:55| 来源: 网络整理| 查看: 265

pyecharts是一个百度做的数据可视化模块,做好的echarts图可以存为html\svg等多种格式,具有极好的交互性和展示性。

文档很详细,先把官网中文文档放上来:http://pyecharts.org/#/zh-cn/prepare 

因为最近自己有这样的可视化需求,所以用到了pyecharts这个模块,现在将一路上积累到的经验分享给大家。

地图可视化:地图包

pyecharts为了迎合轻量级的趋势,把地图数据独立出来成为了一些新的地图包了,所以如果要用到地图数据就需要另外安装这些地图包了。

如果你没装地图包,又直接拿别人的代码来直接跑(我身边的一个老铁就是拿我代码跑出了这个情况),大概率就是看到下面这个图(南海诸岛)。不用多想了,就是没装地图包。什么?你刚刚装了还是不行?那就重启你的notebook,重启可以解决80%的问题,没跑了。

没有装地图包 就将下面这些全装了:依次是全球地图、中国省级地图、中国市级地图、中国区县级地图、中国区域地图。

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

 还有一个地图数据扩展包:  echarts-cities-pypkg

pip install echarts-cities-pypkg

 这个包我建议你用的时候再装,不要混淆了自己;

这个包里面都是一些全球区域内的地点和经纬度的映射,像这样:[{'area':[longitude,latitude]}]

由于全球各地的地区众多,总会有重名的,特别是一些县区级一下的地名;

可能就是因为重名问题,所以官方没有在之前的五个地图包提供县区级以下的地点,但提供了这一个全球的地图数据扩展包,它就是帮助我们检索一些在之前的五个地图包中没有而你又需要用到的地点。

点开:echarts-cities-pypkg,你就可以看到这个包里面包含的10k+个地点,当然你也可以用ctrl+F来搜索你感兴趣的地点。

注:这个包里面的地点都是英文命名的。

关于检索

我们需要知道安装的这些包里面包含了那些地点,pyecharts的检索功能就可以帮到我们。

具体检索方法细节:

from pyecharts.datasets.coordinates import get_coordinate,search_coordinates_by_keyword #常用检索方式1:get_coordinate,以列表形式返回检索到的地点的经纬度,[longitude,latitude] #如果所传入的area未定义,则返回None coordinate = get_coordinate('Nansha',region='CN') print(coordinate) # [113.5682, 22.80423] #常用检索方法2:search_coordinates_by_keyword,根据所输入的关键字进行模糊搜索 #返回一个匹配的字典对象,{'area1': [longitude,latitude],...},如果未能找到匹配的地点,则返回空字典{} coordinate = search_coordinates_by_keyword('番禺') print(coordinate) #{'番禺': [113.22, 22.57], '番禺区': [113.35, 22.95]} #注:上述两种检索方法不能检索自定义地点坐标(add_coordinate)

pyecharts的检索功能更多的是对 Geo()、地点名:[经纬度] 而做的交互,检索功能对Map()地图区域可视化作用基本为零,后面会提到。

地图可视化:Map() 和 Geo() pyeachrts上针对可图可视化的基本图表有Map和Geo这两个; Map是实现地图区域可视化,是区域可视化,例如这样:

数据都是随机的,实例代码:

import numpy as np from pyecharts import Map areas = ['广东','广西','湖南','江西','福建'] values = np.random.randint(1,100,size = 5) test_map = Map("test", width=1200, height=600) test_map.add("", areas, values, maptype='china', is_visualmap=True, visual_text_color='#000', is_label_show=True) test_map #notebook上会直接显示,不行就加上.render() 然后在当前文件目录上找 Geo是实现的地图散点图可视化,散点也可以根据数值大小而变化,这就变成地图气泡图,例如这样:

实例代码:

import numpy as np from pyecharts import Geo areas = ['广东','广西','湖南','江西','福建'] values = np.random.randint(1,100,size = 5) test_geo = Geo("test", width=1200, height=600) test_geo.use_theme('dark') test_geo.add("散点图",areas, values, maptype='china', is_visualmap=True, is_label_show=True, border_color = '#fff') #画地图散点十分建议指定边界颜色为一个较亮的颜色 test_geo #notebook上会直接显示,不行就加上.render() 然后在当前文件目录上找

Geo() 可以指定 visual_type="size" 来画气泡图

实现代码:

import numpy as np from pyecharts import Geo areas = ['广东','广西','湖南','江西','福建'] values = np.random.randint(1,100,size = 5) test_geo = Geo("test", width=1200, height=600) test_geo.use_theme('dark') test_geo.add("气泡图",areas, values, maptype='china', is_visualmap=True, is_label_show=True, visual_type="size", border_color = '#fff') #画地图散点十分建议指定边界颜色为一个较亮的颜色 test_geo #notebook上会直接显示,不行就加上.render() 然后在当前文件目录上找

一切都是这么的顺利,世界和平,画完,收工,再见!

然而事实却是百般不顺,我总会撞上奇奇怪怪的问题,现在正式进入主题。

坑1:Map() 地图区域显示不全

当传入一个未定义的地名给Map(),不会error也不会有warning,但传入的未定义的点就肯定画不出来了;这个处理好坏就很明显,好处是肯定会出来一个图,坏处就是少画了一个区域,自己却完全不知道;假设我要画中国二十个省份的数据,但某一个地名的偏旁错了,提笔忘字的程序猿是铁定看不出来这个字偏旁错了,但图却画出来了,看到花花绿绿的十几个区域,很开心,自己丢了数据都不知道。

那怎么解决呢?

相信这个时候你应该和我想到一起了,上面提过pyecharts提供了检索功能,而且还有模糊搜索功能,简直不要太完美,那在画图之前给每一个地点检索一次,如果有某个地点检索为空,就打印出该地点名,我们再观察该地点名,是不是这个地点中有错字?或者是安装的包上没有这个地点?

解决代码:

def remove_None(areas,values): None_areas = [] i = 0 while(i != len(areas)): if search_coordinates_by_keyword(areas[i]) == {}: None_areas.append(areas[i]) areas.remove(areas[i]) values.remove(values[i]) else: i = i + 1 print('无效区域:',None_areas) return areas,values

就这样就成功解决了吗?答案是没有;

我当时的需求是给广州 各个区 标数据,现在假设我的需求就是你的需求。

假设你要在广州地图上给番禺区上色,如果你的数据上地点名是"番禺区",那没问题,检索成功且可以成功画出,但如果你的数据上的地名是"番禺",你可以成功检索到这个地名,但你的地图上却会空白一片;    更离谱的是,如果你要在广州地图给增城区上色,存在两种情况,1、你模糊检索"增城区",结果会是空字典,检索不通过,于是乎将其移除掉  2、你模糊搜索"增城",会得到这样的检索结果{'增城': [113.49, 23.18], '增城市': [113.83, 23.3]},然后将"增城"传入Map画图,结果却又是一片空白,又将另一个模糊搜索的结果"增城市"传入函数,结果却还是空白;    更更离谱的是,如果你要在广州地图上给南沙上色,你模糊搜索"南沙区"或是"南沙"或是其他你能想到的南沙的别名,结果都会是空字典,或者我直接讲,我们检索的数据包中是缺少了南沙的数据的。(这里先不讨论安装了 echarts-cities-pypkg 地图数据拓展包的情况)

上述就是我在解决需求问题时,遇到的一系列问题;如果你没有遇到,那么恭喜你,你不会再遇到了;

经过n次画图尝试,我发现检索功能对Map()的作用基本为零,Map()只画地图中已经标记好名称的区域,就是说Map和检索到的结果基本没关系,要给"增城区"和"南沙区"这两个区域上色,就直接传入"增城区"和"南沙区",因为广州地图上给这两个区域的名称是"增城区"和"南沙区"。那有没有获取某地图中所有区域名称的方法?不清楚,我目前还没找到。

关于检索数据包中缺少南沙的数据,可以去到自己的python的包目录\site-packages\pyecharts\datasets\下,打开一个city_coordinates.json文件,就可以看到广州附近的数据中,包含了所有的区,却唯独缺失了南沙。部分数据:  "龙山县": [     109.43,     29.47   ],   "广州市": [     113.27,     23.13   ],   "荔湾区": [     113.23,     23.13   ],   "越秀区": [     113.27,     23.13   ],   "海珠区": [     113.25,     23.1   ],   "天河区": [     113.35,     23.12   ],   "黄埔区": [     113.45,     23.1   ],   "番禺区": [     113.35,     22.95   ],   "花都区": [     113.22,     23.4   ],   "增城市": [     113.83,     23.3   ],   "从化市": [     113.58,     23.55   ],   "韶关市": [     113.6,     24.82   ],

坑2:Geo()中地点缺失

首先,Geo()不同于Map(),当传入一个未定义的地点时,会直接报错,就是说,传入了5个数据点,没有error,基本都会出现5个点;报错了,就看看是到底是那个地名错了,或者缺失了。

这里为了避免函数出错,可以改进我上述的一个函数,每次取地名的前两个字来模糊查询,之后再将模糊查询的结果代替原地名,继续用上面的例子,模糊搜索"增城区"是不会有结果的,但取前两个字"增城"再对其模糊查询就会有结果,再用模糊查询结果来替代原地名,这样就可以避免很多的地名错误。

优化函数:

def remove_None(areas,values): None_areas = [] i = 0 while(i != len(areas)): #取前两个字符作模糊查询 if search_coordinates_by_keyword(areas[i][:2]) == {}: None_areas.append(areas[i]) areas.remove(areas[i]) values.remove(values[i]) else: #将模糊查询结果替代原地名 areas[i] = search_coordinates_by_keyword(areas[i][:2]).popitem()[0] i = i + 1 print('无效区域:',None_areas) return areas,values

经过这个优化函数,很多的地名问题都是可以解决的,剩下的就是地点缺失问题了。

像已经知道的,南沙这样的地点检索不到,但我们又有这个需求,这个时候就需要有两种方法:1、就是安装之前提到的地图数据扩展包:  echarts-cities-pypkg ,上面的10k的数据点很可能就包含了你之前找不到的那个地点,安装了之后,检索一下拼音试一试吧,像南沙,检索get_coordinate('Nansha',region='CN')就ok了;2、自定义坐标点,我更推荐这种方面,因为自由度高太多了。

关于自定义坐标点

官方提供了很多自定义坐标的方法,链接:https://github.com/pyecharts/geo-region-coords

我觉得add_coordinate()更简单一些,具体用法如下:

#add_coordinate import numpy as np from pyecharts import Geo areas = ['广东','广西','湖南','江西','福建'] #values = np.random.randint(1,100,size = 5) areas.append('add市') values = np.random.randint(1,100,size = 6) test_geo = Geo("test", width=1200, height=600) #这里添加一个自定义坐标 test_geo.add_coordinate('add市',115,24) test_geo.use_theme('dark') test_geo.add("散点图",areas, values, maptype='china', is_visualmap=True, is_label_show=True, border_color = '#fff') test_geo

新增了一个"add市"

另外,如果需要画的是气泡图,很可能会出现两个坐标点十分拥挤,而使得气泡图十分"难看"的情况,为了提升展示效果,也可以对地图上本来已经有的坐标点,自定义一个同名的新的坐标点,Geo会以新定义的坐标点为准而画图,使得点与点之间没那么拥挤。(其实就是折腾自己来提升展示效果)

另外,如果你使用windows7来编译代码,可以也会出现一些缺失情况。可以换个电脑系统试试。

上述内容都是个人的一些经历经验,希望可以帮到你,个人水平有限,个别错误在所难免,欢迎指正。

 

 

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3