最近探索出来一个在Python中创建热力图非常高效的方法,使用folium包来创建热力图,实际效果非常赞,过程简单,代码量少。
folium包基于leaflet在线地图库封装,在R语言中leaflet的接口已经非常完善,如果你对R语言中的leaflet包api接口感兴趣,可以参考这几篇文章。
leaflet地图:
Leaflet在线地图进阶宝典——json素材操纵与图层面板控制
leaflet的小搭档leaflet.minicharts来了,从此动态地图又多了一些乐趣~~~
folium包支持多种类型的空间可视化形式,今天这一篇仅就其中的热力密度图进行分享。
首先通过一个小脚本抓取以下几个城市的经纬度
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 = ['北京','天津','石家庄','太原','呼和浩特','沈阳','大连','长春','哈尔滨','上海','南京','杭州','宁波','合肥','福州','厦门','南昌','济南','青岛','郑州','武汉','长沙','广州','深圳','南宁','海口','重庆','成都','贵阳','昆明','拉萨','西安','兰州','西宁','银川','乌鲁木齐']
这段小脚本用于获取各个城市的经纬度地址:
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热力图数据结构的数据对象:
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))]
输入热力图数据源,并可视化输出
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数据进行热力图展示。
posi = pd.read_excel("D:/Python/File/Cities2015.xlsx") posi = posi.dropna()
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))]
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
https://edu.hellobi.com/course/264
文章转载自数据小魔方,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。