本案例可以直观地看出,我国人口在各省之间的流动特点,并据此了解各省之间的相关性。
本次学习使用的数据为1985至1990年(好久远呀)的人口迁移数据。数据样式如下:
其中from 为流出省份,to为流入省份,count为人口数量。
在实际研究中,我们为了观察主要特征,往往采取抓大放小的措施。在这里也是一样,对于count较小的数据,不作为我们本次的研究对象。此次查看的数据为迁移次数大于80000的记录,所以导入方式如下: 【脚本】
data = pd.read_csv(r'D:\population.csv', encoding='GBK') #将大于8万的数据转成list以备地图上展示 result = data[data['count']>80000][['from', 'to']].values.tolist() geo = Geo() geo.add_schema(maptype='china') #将result数据显示在地图上,并确定了线型为曲线 geo.add('1985~1990人口迁移图', result, type_=ChartType.LINES, linestyle_opts=opts.LineStyleOpts(curve=0.2)) #不显示标签 geo.set_series_opts(label_opts=opts.LabelOpts(is_show=False)) geo.render()【结果】
【脚本】
#以流入省分组汇总流入人口量 result2 = data[['count']].groupby(data['to']).sum() result2 = result2.reset_index() result2 = result2.values.tolist() #以热点图的方式将数据载入地图 geo.add('', result2, type_=ChartType.HEATMAP) geo.set_global_opts(visualmap_opts=opts.VisualMapOpts(max_=1300000))【结果】
【特别说明】 数据在按流入城市groupby后,索引即变为“to”列了,但索引是不能通过values.tolist()方式转为二维列表的,为此,需要增加一个reset_index()将索引列转为普通数值列。
网络图有两个关键元素,一个是“节点”,一个是“边”。 其中“边”需要是字典格式,分别给出边的起点和终点,形如: [{‘source’: ‘天津’, ‘target’: ‘北京’}, {‘source’: ‘河北’, ‘target’: ‘北京’}……
“节点”也字典格式,分别给出节点的名称和大小,形如: [{‘count’: 665526, ‘name’: ‘上海’}, {‘count’: 250264, ‘name’: ‘云南’}…… 【脚本】
#整理边的格式 data = data[data['count'] > 50000] links = data[['from', 'to']].rename(columns={'from':'source', 'to':'target'}).to_dict(orient='records') #整理节点的格式 result3 = data[['count']].groupby(data['to']).sum() result3['name']= result3.index result3 = result3.rename(columns={'count':'size'}) nodes = result3.to_dict(orient='records') #画图 graph = Graph() graph.add('',nodes, links) graph.render()【结果】
本节学习了Geo()的线条设置,并学习了网络图的绘制。此外,还学习了DataFrame转为list和dict数据类型的方法。