地图绘制也是一种有效的可视化方法,它可以直观的将数据内容通过文本和颜色等不同方式展示在地图上,形成一种有效的呈现方式。
Python地图有很多库可以使用,我们这次使用的是著名的pyecharts,它可以更方便的实现地图的绘制。
为此,我们首先还是需要在设置上导入pyecharts库,具体过程同前面所述一致。
我们先绘制一个简单的地图看看。
from pyecharts.charts import Geo
geo = Geo()
geo.add_schema(maptype=”china”)
geo.render()
首先导入Geo类型,这个类型就是绘制地图的关键类型。创建它的变量后,调用add_schema方法指定地图类型为中国,即可render绘制。
此时会在当前项目中生成一个render.html文件,可以右击选择“在浏览器打开”,选择合适的浏览器即可看到结果。
之所以在浏览器才能查看结果,是因为这个是利用网页方式提供绘图功能。
这个地图已经可以显示动态效果,比如停留某个身份可以变亮,
滚动鼠标滑轮还能缩放地图。
好了,我们接下来准备数据。关于各省的GDP数据,可以考虑使用中国国家统计局的官方数据。在地区数据中,可以选择分省年度数据。
在地区数据中,可以选择全部地区。
此时登录即可免费下载,可以选择CSV格式。
下载数据的格式比较多,因此建议大家首先先简单处理下,将无关的一些格式信息去除。比如这里的头三行,
还有最后几行,都可以删除,形成标准的二维数据表格。
我们首先还是利用DataFrame读取下数据。
# coding:utf-8
import pandas as pd
frame = pd.read_csv(‘C:\\temp\\分省年度数据.csv’, encoding=’GBK’)
print(frame)
这里显示的是10年的数据。
我们读取其中最近一年2019年的数据,这里要注意一个问题,那就是pyecharts绘制地图需要一个二维列表结构的数据,因此我们需要读取地区和年份后,通过tolist方法转换为对应的格式:
print(frame[[‘地区’, ‘2019年’]].values.tolist())
现在就可以将其绘制在地图上:
# coding:utf-8
import pandas as pd
from pyecharts.charts import Geo
frame = pd.read_csv('C:\\temp\\分省年度数据.csv', encoding='GBK')
geo = Geo()
geo.add_schema(maptype="china")
geo.add("", frame[['地区', '2019年']].values.tolist())
geo.render()
这里的add函数就是增加数据,第一个参数表示图表名称,我们留空,第二个就是数据内容。这其实是把刚才的两段内容结合在了一起,但是报错了。什么错误呢?其实很简单,地区名称对应不上,原因在于pyecharts中对部分省份的标注与国家统计局不一致,比如“广西壮族自治区”应该改为“广西省”等等。
这里其实只需修改三个省份数据即可。大家可以自行根据错误提示进行修改,这也说明数据分析之前数据整理是非常必要的环节。
再次运行下,就可以在生成的网页中看到结果,
也可以刷新下这个网页来看。中心点大约是省会的位置。
这个网页具有较强的交互性,移动和悬浮鼠标都可以看到不同的变化。
默认情况下,地图上显示的数据内容过多。我们可以酌情去除。
from pyecharts import options as opts
geo.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
geo.render()
这个设置就是表示将当前标签上的数据内容不予显示。这里不要忘记导入options类型,在pyecharts中,图表的一切皆通过options来修饰调整。
但是这时无法看出这些不同数据的直观特点,因此我们可以通过添加颜色来标注数据的大小:
geo.set_global_opts(visualmap_opts=opts.VisualMapOpts(max_=110000))
geo.render()
这里面的max_参数就表示最大值。
由于这些数据分布并不平均,甚至可以自己来定义不同的颜色区间:
geo.set_global_opts(visualmap_opts=opts.VisualMapOpts(
is_piecewise=True,
pieces=[
{"min": 0, "max": 10000, "label": "1", "color": "blue"},
{"min": 10001, "max": 20000, "label": "2", "color": "cyan"},
{"min": 20001, "max": 50000, "label": "5", "color": "green"},
{"min": 50001, "max": 80000, "label": "8", "color": "yellow"},
{"min": 80001, "max": 100000, "label": "10", "color": "orange"},
{"min": 100001, "max": 200000, "label": "20", "color": "red"}
]
))
geo.render()
这里看起来复杂,其实很简单,就是设定了is_piecewise属性表述分段,同时通过pieces属性后面的字典数据给出了每个段的上下限、标签和颜色。
显然这样更为灵活和定制化。
默认的外观比较简单,我们可以来看下。
比如对于点的形状,就可以通过设置来改变:
geo.add(“”, frame[[‘地区’, ‘2019年’]].values.tolist(), type_=ChartType.EFFECT_SCATTER)
geo.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
geo.set_global_opts(visualmap_opts=opts.VisualMapOpts(max_=110000))
geo.render()
这里的add函数增加了type说明。
这个点会自动呈现变化的动态效果。
甚至可以在add函数中增加颜色样式,设置地图的色彩:
geo.add_schema(maptype=”china”, itemstyle_opts=opts.ItemStyleOpts(color=”#DD0000″, border_color=”#FFFFFF”))
这里面color表示地图背景色,而border_color表示边的颜色。
效果呈现出火热的中国红。大家可能会注意到这里的颜色很奇怪,这其实是计算机表示颜色的一种简单有效方法,
里面有三个部分,每个部分最小为00,最大为FF,这是十六进制的最大值,分别对应红绿蓝,所以边框三色全满,就是白色,而地图背景色绿蓝皆为无,红色淡了一些,形成略浅一些的中国红。大家可以自己大胆的调配看看效果。
也可以使用Map来填充
# coding:utf-8
import pandas as pd
from pyecharts.charts import Map
from pyecharts import options as opts
frame = pd.read_csv('C:\\temp\\分省年度数据2.csv', encoding='GBK')
map = Map()
map.add("", frame[['地区', '2019年']].values.tolist(), "china")
map.set_global_opts(visualmap_opts=opts.VisualMapOpts(max_=110000))
map.render()
这里使用了Map类型,基本用法差不多,主要区别在于add中第三个参数指定地图位置。
该类型使用颜色填充的方式,而不是点的方式,来显示不同数据的情况。
这里要注意一个细节,就是数据需要整理下,Map使用的中国各省份和Geo不一样,需要将全部的省、市、自治区等去掉。于是这里我们保存为“分省年度数据2.csv”文件。