本文是利用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文件就可以看到工资地图了