可视化:中国地图 python/ geopandas/ echarts
(区块链现在也成了“牛夫人”)
前言
地图,在可视化中总是引人注目的。之前我们介绍了。本篇我们在python中搞定地图,主要结合我在BMW丰富的画地图经历总结一下,到lync很久没用python工作了,手生。主要介绍两种常用方法:
-
用geopandas画中国地图 用pyecharts画中国地图
整体流程
-
准备数据(包括地理目标数据和地理辅助数据) 画地图作为背景 画目标数据
geopandas
geopandas的步骤其实和R很像 准备数据
另一个需要的数据,城市的地理属性。表二,城市(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读入,然后转化为字典形式,不过注意各省名字保持规范。缺点就是必须联网才能画出来,需要官方服务器传回数据。
