使用Python中的folium包創建熱力密度圖

使用Python中的folium包創建熱力密度圖

來自專欄 Excel數據分析與可視化

最近探索出來一個在Python中創建熱力圖非常高效的方法,使用folium包來創建熱力圖,實際效果非常贊,過程簡單,代碼量少。folium包基於leaflet在線地圖庫封裝,在R語言中leaflet的介面已經非常完善,如果你對R語言中的leaflet包api介面感興趣,可以參考這幾篇文章。leaflet地圖:動態地理信息可視化——leaflet在線地圖簡介動態地理信息可視化——散點地圖系列動態地理信息可視化——leaflet構造路徑圖動態地理信息可視化——leaflet填充地圖Leaflet在線地圖進階寶典——json素材操縱與圖層面板控制leaflet在線地圖進階寶典之——高級輔助特性leaflet在線地圖進階寶典——高級交互特性leaflet的小搭檔leaflet.minicharts來了,從此動態地圖又多了一些樂趣~~~folium包支持多種類型的空間可視化形式,今天這一篇僅就其中的熱力密度圖進行分享。首先通過一個小腳本抓取以下幾個城市的經緯度import foliumimport timeimport requestsfrom urllib.request import quoteimport numpy as npimport pandas as pdimport seaborn as snsimport webbrowserfrom folium.plugins import HeatMapaddress = [北京,天津,石家莊,太原,呼和浩特,瀋陽,大連,長春,哈爾濱,上海,南京,杭州,寧波,合肥,福州,廈門,南昌,濟南,青島,鄭州,武漢,長沙,廣州,深圳,南寧,海口,重慶,成都,貴陽,昆明,拉薩,西安,蘭州,西寧,銀川,烏魯木齊]這段小腳本用於獲取各個城市的經緯度地址: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) #在本地瀏覽器打開

是不是效果看起來很良心呀,而且整體的代碼量和過程都無比簡單,快學起來吧!

數據源:

github.com/ljtyduyu/Dat

edu.hellobi.com/course/

閱讀原文

推薦閱讀:

地理信息+,共享經濟和萬眾創新
心無旁騖,向死而生:WGDC2016給創企上的一堂課
數字城市的末班車
對個人地理信息的定位,是 Wi-Fi 更準確還是 3G 信號更準確,為什麼?
珠峰有多高?(指從山腳下到頂峰的垂直距離)?

TAG:Python | 數據可視化 | 地理信息 |