前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python可视化与basemap数据地图系列1

Python可视化与basemap数据地图系列1

作者头像
数据小磨坊
发布2018-07-25 11:49:23
1.9K0
发布2018-07-25 11:49:23
举报
文章被收录于专栏:数据小魔方数据小魔方

最近在梳理Python中可以制作数据地图的可视化工具包,分别实践了geopandas、folium、Basemp,通过对比发现,静态地图中最为成熟的最终还得是Basemap工具,它是mpl_toolkits包中的一个专门用于构建地理信息数据可视化的扩展库。

Basemap工具在地理信息读写、坐标映射、空间坐标转化与投影等方面做的要比geopandas更加成熟,它可以使用常规的地图素材数据源(shp)作为底图进行叠加绘图,效果与精度控制比较方便,图表质量堪比R语言中的ggplot2绘图包(geom_polygon),唯一不足的是它是一个底层构建工具,所有的多边形映射都需要手动构造循环(目前还没有发现比较好用的基于basemap的扩展工具),作图效率与速度上自然无法媲美R语言的ggplot2(缺少一套健全的顶层语法支撑)。

接下来会用3~5篇的篇幅分享给大家基于basemap包的应用场景,包含散点图(气泡图)、折现图(路径图等线图类型)以及最常用的热力填充地图。

本小节介绍填充地图与散点图应用,案例是使用itchat接口抓取的本人微信好友信息。

代码语言:javascript
复制
import itchat
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib
from matplotlib.patches import Polygon
from mpl_toolkits.basemap import Basemap
from matplotlib.collections import PatchCollection

1、微信网页版登录:

代码语言:javascript
复制
itchat.login()
#使用手机微信扫一扫扫描弹出二维码即可登录。
#Getting uuid of QR code.
#Downloading QR code.
#Please scan the QR code to log in.
#Please press confirm on your phone.
#Loading the contact, this may take a little while.
#Login successfully as 杜雨

代码语言:javascript
复制
#提取微信好友信息:
friends = itchat.get_friends(update=True)
df_friends = pd.DataFrame(friends)
df_friends.to_csv("wechat_friends.csv",encoding = "utf_8_sig")
#friends = pd.read_csv("D:/Python/File/wechat_friends.csv")
mydata = friends.loc[:,["NickName","Province","Signature"]]

2、聚合计算好友地区分布:

代码语言:javascript
复制
aggResult = mydata.groupby(['Province'])['NickName'].agg({'人数': np.size}).reset_index()
aggResult.sort_values(by = ['人数'],ascending = False,inplace=True)

代码语言:javascript
复制
#拆分国内城市与国外城市:

def match_str(item):
    result = []
    for i in item:
        try: 
            m = re.search("^[\u4e00-\u9fa5]{1,}",i).group()
            result.append(m)
        except:
            continue
    return(result)

Domestic = match_str(aggResult["Province"].tolist())
Domestic = aggResult.loc[aggResult.Province.isin(Domestic),:]
Foreign  = aggResult.loc[aggResult.Province.isin([i for i in aggResult.Province.tolist() if i not in Domestic.Province.tolist()]),:]
Domestic['scala'] = (Domestic.人数-Domestic.人数.min())/(Domestic.人数.max()-Domestic.人数.min())

清洗与矫正省份(地区)名称

代码语言:javascript
复制
def correct(name_list):
    name = []
    for i in name_list:
        if i in ["内蒙古","西藏"]:
            i += "自治区"
        elif i == "宁夏":
            i += "回族自治区"
        elif i == "新疆":
            i += "维吾尔族自治区"
        elif i == "广西":
            i += "壮族自治区"
        elif i in ["中国香港","中国澳门","中国台湾"]:
            i += "特别行政区"
        elif i in ["北京","天津","重庆","上海"]:
            i += "市"
        else:
            i += "省"name.append(i)
    return(name)
Domestic["Province"] = correct(Domestic["Province"])

3、合并本地经纬度数据: #散点图数据源:

代码语言:javascript
复制
point_data = pd.read_csv("D:/R/rstudy/Province/chinaprovincecity.csv",encoding = "gbk") 
Domestic = Domestic.merge(point_data.loc[:,["province","jd","wd"]],how = "left",left_on = "Province",right_on = "province")

实例化地图对象,并导入本地shp中国地图

代码语言:javascript
复制
basemap = Basemap(llcrnrlon= 75,llcrnrlat=10,urcrnrlon=150,urcrnrlat=55,projection='poly',lon_0 = 116.65,lat_0 = 40.02,ax = ax)
basemap.readshapefile(shapefile = "D:/R/rstudy/CHN_adm/bou2_4p",name = "china")

导入的shp格式地图中很多行政区划信息乱码,需要纠正编码

代码语言:javascript
复制
mapData = pd.DataFrame(basemap.china_info)
mapData["NAME"] = mapData["NAME"].map(lambda x: x.decode("gbk") if len(x) != 0 else x)
#mapData["NAME"] = [i.decode("gbk") if len(i) !=0 else i for i in mapData["NAME"].tolist()]
mapData = mapData.merge(Domestic,how = "left",left_on='NAME', right_on="Province")

4、数据可视化

代码语言:javascript
复制
font = {'family' : 'SimHei'};
matplotlib.rc('font', **font);
fig = plt.figure(figsize=(16,12))
ax  = fig.add_subplot(111)

###构建省份填充函数(按照各省好友人数比例):
def plotProvince(row):
    mainColor = (42/256, 87/256, 141/256,row['scala']);
    patches = []
    for info,shape in zip(mapData["NAME"].tolist(),basemap.china): 
        if info == row['Province']:
            patches.append(Polygon(xy = np.array(shape), closed=True))
    ax.add_collection(PatchCollection(patches,facecolor=mainColor,edgecolor=mainColor,linewidths=1.,zorder=2))
Domestic.apply(lambda row: plotProvince(row), axis=1)
    #构建散点图(基于各省好友数量)

def create_great_points(df):
    lon   = np.array(df["jd"])
    lat   = np.array(df["wd"])
    pop   = np.array(df["scala"],dtype=float)
    x,y = basemap(lon,lat)
    for lon,lat,pop in zip(x,y,pop*50):
        basemap.scatter(lon,lat,color = "#c72e29",marker = "o",s = pop*25)
create_great_points(Domestic)

plt.axis("off")  #关闭坐标轴
plt.savefig("D:/Python/Image/杜雨/itwechat.png") #保存图表到本地
plt.show()    #显示图表

整个内容中涉及到的bou2_4p.shp,chinaprovincecity.csv均为之前推送过的R语言ggplot2系列所用数据源,公开在github上:

https://github.com/ljtyduyu/DataWarehouse,friends数据集是直接用itchat包扫码登录获取的好友数据,无需多余配置,整个过程非常简单。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-05-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据小魔方 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 导入的shp格式地图中很多行政区划信息乱码,需要纠正编码
相关产品与服务
图数据库 KonisGraph
图数据库 KonisGraph(TencentDB for KonisGraph)是一种云端图数据库服务,基于腾讯在海量图数据上的实践经验,提供一站式海量图数据存储、管理、实时查询、计算、可视化分析能力;KonisGraph 支持属性图模型和 TinkerPop Gremlin 查询语言,能够帮助用户快速完成对图数据的建模、查询和可视化分析。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档