使用Python中的folium包创建热力密度图

2018-07-25 11:50:36 浏览数 (1)

最近探索出来一个在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

0 人点赞