最近探索出来一个在Python中创建热力图非常高效的方法,使用folium包来创建热力图,实际效果非常赞,过程简单,代码量少。
folium包基于leaflet在线地图库封装,在R语言中leaflet的接口已经非常完善,如果你对R语言中的leaflet包api接口感兴趣,可以参考这几篇文章。
leaflet地图:
动态地理信息可视化——leaflet在线地图简介
动态地理信息可视化——散点地图系列
动态地理信息可视化——leaflet构造路径图
动态地理信息可视化——leaflet填充地图
Leaflet在线地图进阶宝典——json素材操纵与图层面板控制
leaflet在线地图进阶宝典之——高级辅助特性
leaflet在线地图进阶宝典——高级交互特性
leaflet的小搭档leaflet.minicharts来了,从此动态地图又多了一些乐趣~~~
folium包支持多种类型的空间可视化形式,今天这一篇仅就其中的热力密度图进行分享。
首先通过一个小脚本抓取以下几个城市的经纬度
代码语言:javascript复制import folium
import time
import requests
from urllib.request import quote
import numpy as np
import pandas as pd
import seaborn as sns
import webbrowser
from folium.plugins import HeatMap
address = ['北京','天津','石家庄','太原','呼和浩特','沈阳','大连','长春','哈尔滨','上海','南京','杭州','宁波','合肥','福州','厦门','南昌','济南','青岛','郑州','武汉','长沙','广州','深圳','南宁','海口','重庆','成都','贵阳','昆明','拉萨','西安','兰州','西宁','银川','乌鲁木齐']
这段小脚本用于获取各个城市的经纬度地址:
代码语言:javascript复制def getid(dizhi):
url = "http://api.map.baidu.com/geocoder/v2/"
header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36'}
payload = {
'output':'json',
'ak':'X8zlxPUdSe2weshrZ1WqnWxb43cfBI2N'
}
addinfo = []
for i in dizhi:
payload['address'] = i
try:
content = requests.get(url,params=payload,headers=header).json()
addinfo.append(content['result']['location'])
print("正在获取{}的地址!".format(i))
except:
print("地址{}获取失败,请稍后重试!".format(i))
pass
time.sleep(.5)
print("所有地址均已获取完毕!!!")
return(addinfo)
if __name__ == "__main__":
#计时开始:
t0 = time.time()
myaddress = getid(address)
t1 = time.time()
total = t1 - t0
print("消耗时间:{}".format(total))
创建基于folium热力图数据结构的数据对象:
代码语言:javascript复制lon = np.array([i["lng"] for i in myaddress],dtype=float)
lat = np.array([i["lat"] for i in myaddress],dtype=float)
scale = np.random.randint(100,500,len(address))
data1 = [[lat[i],lon[i],scale[i]] for i in range(len(address))]
输入热力图数据源,并可视化输出
代码语言:javascript复制map_osm = folium.Map(location=[35,110],zoom_start=5)
HeatMap(data1).add_to(map_osm)
file_path = r"D:/Python/Image/People.html"map_osm.save(file_path)
webbrowser.open(file_path)
以上数据是虚构的,整体效果也没有任何意义,接下来尝试着对全球城市发展报告中中国各个城市的gdp数据进行热力图展示。
代码语言:javascript复制posi = pd.read_excel("D:/Python/File/Cities2015.xlsx")
posi = posi.dropna()
代码语言:javascript复制lat = np.array(posi["lat"][0:len(posi)])
lon = np.array(posi["lon"][0:len(posi)])
pop = np.array(posi["pop"][0:len(posi)],dtype=float)
gdp = np.array(posi["GDP"][0:len(posi)],dtype=float)
data1 = [[lat[i],lon[i],pop[i]] for i in range(len(posi))]
代码语言:javascript复制map_osm = folium.Map(location=[35,110],zoom_start=5)
HeatMap(data1).add_to(map_osm)
file_path = r"D:/Python/Image/People.html"map_osm.save(file_path) #保存本地
webbrowser.open(file_path) #在本地浏览器打开
是不是效果看起来很良心呀,而且整体的代码量和过程都无比简单,快学起来吧!
数据源:https://github.com/ljtyduyu/DataWarehouse/tree/master/File