可视化:中国地图 python/ geopandas/ echarts
(區塊鏈現在也成了“牛夫人”)
前言
地圖,在可視化中總是引人注目的。之前我們介紹了如何用R語言中的ggplot2畫中國地圖。本篇我們在python中搞定地圖,主要結合我在BMW豐富的畫地圖經歷總結一下,到lync很久沒用python工作了,手生。主要介紹兩種常用方法:
-
用geopandas畫中國地圖
-
用pyecharts畫中國地圖
整體流程
首先,獲取地理文件信息,可以從國家地理中心(webmap.cn)下載,有各個省、市的。公眾號后臺回復“地圖”,可以獲取原數據與源碼。https://github.com/hongyingyue/Tiny-skills-of-data。
- 準備數據(包括地理目標數據和地理輔助數據)
- 畫地圖作為背景
- 畫目標數據
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 optsprovince_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
總結
以上是生活随笔為你收集整理的可视化:中国地图 python/ geopandas/ echarts的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Debug pycharm: Error
- 下一篇: SpringMVC参数的传递——接收Li