Python绘制各大城市职工工资分布地图

本文是利用Python绘制全国各大城市在岗职工平均工资(2016年)的地图分布情况。思路是:首先利用百度地图API爬取各大城市的经纬度坐标(绘制地图需要),而后从中国国家统计局下载2016年全国各大城市在岗职工平均工资数据,调用Python第三方库Folium绘制地图,保存成html文件。

先来看一下最终的效果吧


图1 全国各大城市在岗职工平均工资(2016年)的地图分布情况

 环境:windows 64位

平台:Jupyter Notebook (kernel python 3)

库:pandas numpy folium matplotlib 

百度地图API获取数据

百度地图提供了强大的API功能,其中输入地点返回经纬度的调用格式为

http://api.map.baidu.com/geocoder?address=地名&output=json&key=你的秘钥

秘钥需要去百度地图API注册,这里提供一个试用秘钥(37492c0ee6f924cb5e934fa08c6b1676)

获取经纬度的函数包括获取数据函数get_posi和解析数据函数parse_result

def get_posi(address):
    url='http://api.map.baidu.com/geocoder?address='+quote(address)+'&output=json&key=37492c0ee6f924cb5e934fa08c6b1676'
    #注意quote的用法,要将中文转换
    req=requests.get(url).json()
#     response=request.urlopen(req)
#     result=req.read()
    return req
#注意获取网页的方法,直接返回json结构
lats=[]
lngs=[]
def parse_result(result):

    try:
        lat=result['result']['location']['lat']
        lng=result['result']['location']['lng']
        lats.append(lat)
        lngs.append(lng)
    except TypeError:
        lats.append('None')
        lngs.append('None')
#添加try,except,如果无结果返回None
获取职工工资数据

数据下载点我

将下载数据中的地点转换为经纬度

df=pd.read_csv(u'在岗职工平均工资(元)2016.csv',encoding='gbk')
addrs=df[u'地区'].tolist()
for each in addrs:
    result=get_posi(each)
    parse_result(result)
df['lat']=pd.Series(lats,index=df.index)
df['lng']=pd.Series(lngs,index=df.index)
df.to_csv('revised_data.csv')
这里思路比较简单,读取下载的csv文件中的地区列,并使用tolist函数转换为列表,然后对列表中每个元素执行百度地图API操作,函数看上面,将返回的经纬度信息写入文件中并保存,以备不时之需。

这里需要注意输入“西安”时无效,需要输入“西安市”


利用Folium绘制工资地图

df=pd.read_csv('revised_data.csv',encoding='gbk') #读取数据注意编码
lat=np.array(df['lat'])#读取经度
lng=np.array(df['lng'])#读取纬度
salary=np.array(df['2016年'],dtype=float)#读取工资
data=[[lat[i],lng[i],salary[i]] for i in range(len(lat))]#组合经纬度、工资数据为列表形式
map_osm = folium.Map(location=[35,110],zoom_start=5)    #绘制Map,开始缩放程度是5倍
HeatMap(data).add_to(map_osm)  # 将热力图添加到前面建立的map里
map_osm.save('salary.html')#将绘制好的地图保存为html文件
这里主要是要应用Folium库, 官方文档点我

这样就大功告成了,打开html文件就可以看到工资地图了







你可能感兴趣的:(Python)