可视化:中国地图 python/ geopandas/ echarts

在这里插入图片描述

(区块链现在也成了“牛夫人”)

前言

地图,在可视化中总是引人注目的。之前我们介绍了如何用R语言中的ggplot2画中国地图。本篇我们在python中搞定地图,主要结合我在BMW丰富的画地图经历总结一下,到lync很久没用python工作了,手生。主要介绍两种常用方法:

  • 用geopandas画中国地图

  • 用pyecharts画中国地图

整体流程

首先,获取地理文件信息,可以从国家地理中心(webmap.cn)下载,有各个省、市的。后台回复“地图”,可以获取原数据与源码。

  • 准备数据(包括地理目标数据和地理辅助数据)
  • 画地图作为背景
  • 画目标数据

geopandas

geopandas的步骤其实和R很像
准备数据

采用和上一篇中同样的数据进行演示,目标是画出各个城市的销量。表一,城市名(City)与城市属性(Total Year)的关系:
在这里插入图片描述

另一个需要的数据,城市的地理属性。表二,城市(City)与地理位置(经度、纬度)的关系:
在这里插入图片描述

程序的第一步便是读取以上数据:

data = pd.read_csv("../../data/map_R_province.csv")
data_agg = data.groupby(['City'])[['City']].size().reset_index(name='size')
city_name_map = pd.read_csv(open("../../assets/city_geocode_lookup.csv", encoding='gbk'))
data_agg = data_agg.merge(city_name_map, left_on='City', right_on='City', how='left')
geo_data_agg = gp.GeoDataFrame(data_agg, geometry=gp.points_from_xy(data_agg.Lon, data_agg.Lat))
print(geo_data_agg)

有了城市的位置,也有了城市的属性之后,在位置上画出属性的性质。画地图和目标:

def geo_china(df, size_column='size', title='map'):
    china_geod = gp.GeoDataFrame.from_file("../../assets/province.shp", encoding='gb18030')
    print(china_geod.head(5), china_geod.columns)
    ax = china_geod.plot(color='white', edgecolor='black')
    df.plot(ax=ax, color='red', markersize=df[size_column], alpha=0.5)
    #df.plot(ax=ax, column=size_column, cmap='Blues', linewidth=0.8, edgecolor='0.8')
    ax.set_axis_off()
    plt.show()

这里需要注意的是,虽然地理文件只读取了shp文件,但三个文件缺一不可,而且要放在同一路径下。效果如下:

在这里插入图片描述

pyecharts

上面的图并没有进行美化,所以看着和ggplot的美感还有差距。放心,python里还有一招,就是直接调用前端常用的包pyecharts来完成地图的制作,能够达到简化操作就画出漂亮的交互地图效果。

# https://github.com/pyecharts/pyecharts
# you should have Internet connect
from pyecharts.charts import Map,Geo
from pyecharts import options as opts

province_dict = {'河南': 45.23, '北京': 37.56, '河北': 21, '辽宁': 12, '江西': 6, '上海': 20, '安徽': 10, '江苏': 16, '湖南': 9,
                 '浙江': 13, '海南': 2, '广东': 22, '湖北': 8, '黑龙江': 11, '澳门': 1, '陕西': 11, '四川': 7,
                 '内蒙古': 3, '重庆': 3, '云南': 6, '贵州': 2, '吉林': 3, '山西': 12, '山东': 11, '福建': 4, '青海': 1,
                 '天津': 1, '其他': 1}

province_char = [[item[0],item[1]] for item in province_dict.items()]
print(province_char)

map = Map(init_opts=opts.InitOpts(width='1200px', height='800px'))
map.set_global_opts(
    title_opts=opts.TitleOpts(title="2019年"),
    visualmap_opts=opts.VisualMapOpts(max_=50))
map.add("China Map Example", data_pair=province_char, maptype='china', is_roam=True)
map.render(path="中国地图.html")

效果还是非常惊艳的,将生成的html在chrome里打开后,可以带交互效果,并自带了九段线,毕竟是国内bidu出品。输入数据也可以从csv由pandas读入,然后转化为字典形式,不过注意各省名字保持规范。缺点就是必须联网才能画出来,需要官方服务器传回数据。

在这里插入图片描述

联系方式

公众号YueTan

猜你喜欢

转载自blog.csdn.net/weixin_38812492/article/details/112797956