python-地圖視覺化元件folium的操作
folium是python的一個用來繪製地圖,並在地圖上打點,畫圈,做顏色標記的工具類。簡單易學,和pandas可以很好的融合,是居家必備良品。
一 基本功能演示
import folium import webbrowser m=folium.Map(location=[40.009867,116.485994],zoom_start=10) # 繪製地圖,確定聚焦點 folium.Marker([40.2,116.7],popup='浮標上面的那個文字').add_to(m) # 定一個點,放到地圖m上 folium.Marker([40.22,116.72],popup='浮標上面的那個文字',icon=folium.Icon(color='red')).add_to(m) # 把浮標變成紅色 folium.Marker([40.24,116.74],icon=folium.Icon(color='green',icon='info-sign')).add_to(m) # 浮標改圖樣 #標記一個空心的圈 folium.Circle( location=[40.2,117.7],radius=10000,color='crimson',popup='popup',fill=False ).add_to(m) #標記一個實心圓 folium.CircleMarker( location=[39.2,radius=100,color='#DC143C',#圈的顏色 fill=True,fill_color='#6495ED' #填充顏色 ).add_to(m) m.save('f1.html') webbrowser.open('f1.html')
另外,folium還支援互動,比如滑鼠點選的地方顯示經緯度,或者直接在點選過的地方標記一個icon
import folium import webbrowser as wb # 地圖上懸浮顯示經緯度 m = folium.Map( location=[36.68159,117.103565],zoom_start=10 ) m.add_child(folium.LatLngPopup()) # 手動打點功能 m.add_child( folium.ClickForMarker(popup='Waypoint') ) m.save('f2.html') wb.open('f2.html')
二 使用folium繪製散點圖,熱力圖
熱力圖,現實中資料的量級不好控制,有時候用folium畫出的熱力圖,效果往往不是太好。
import numpy as np import pandas as pd import seaborn as sns import folium import webbrowser from folium.plugins import HeatMap #匯入資料集: 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,tiles='http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}',attr="© <a href="http://ditu.amap.com/" rel="external nofollow" >高德地圖</a>" ) #建立以騰訊地圖為底圖的密度圖: map_osm = folium.Map( location=[35,tiles='http://rt{s}.map.gtimg.com/realtimerender?z={z}&x={x}&y={y}&type=vector&style=0',attr="© <a href="http://map.qq.com/" rel="external nofollow" >騰訊地圖</a>" ) #生成互動式地圖: HeatMap(data1).add_to(map_osm) file_path = r"D:/Python/Image/People.html" map_osm.save(file_path) webbrowser.open(file_path)
folium的散點圖更適合作展示,考慮到載入的順暢性,不建議讀取太大的資料,另外其元件可能會讀一些外網的js,如果所在的網路不能訪問google可能效果無法展示。解決辦法是把裡面的js地址替換成國內的映象。
import pandas as pd import numpy as np import os import folium from folium import plugins import webbrowser import geopandas as gp #資料匯入: full = pd.read_excel("D:/Python/File/Cities2015.xlsx") full = full.dropna() #建立地圖物件: schools_map = folium.Map(location=[full['lat'].mean(),full['lon'].mean()],zoom_start=10) marker_cluster = plugins.MarkerCluster().add_to(schools_map) #標註資料點: for name,row in full.iterrows(): folium.Marker([row["lat"],row["lon"]],popup="{0}:{1}".format(row["cities"],row["GDP"])).add_to(marker_cluster) #逐行讀取經緯度,數值,並且打點 #folium.RegularPolygonMarker([row["lat"],row["GDP"]),number_of_sides=10,radius=5).add_to(marker_cluster) schools_map.save('schools_map.html') #儲存到本地 webbrowser.open('schools_map.html') #在瀏覽器中開啟
除此之外folium還可以繪製填充圖,填充圖比較素顏,如下圖
這裡有一些官方示例,感興趣可以看下 :
https://nbviewer.jupyter.org/github/python-visualization/folium/tree/master/examples/
補充:Python遙感視覺化 — folium模組展示熱力圖
“本節通過folium模組來繪製全國PM2.5熱力分佈圖,並生成對應的html檔案。”
今天的遙感之美—歌曲《歐若拉》中的阿拉斯加。阿拉斯加州位於北美大陸西北端,東與加拿大接壤,另三面環北冰洋、白令海和北太平洋。衛星俯瞰神祕北極圈,阿拉斯加的山巔,誰的臉出現海角的天邊(盜用歌詞捂臉)。
哥倫比亞冰川位於美國阿拉斯加州,從海拔3,050米的冰原開始下降,沿著楚加奇山脈的側翼下降,進入一個狹窄的入口,通往阿拉斯加東南部的威廉王子灣,它是世界上變化最快的冰川之一。科學家使用Landsat 4,5,7和8跟蹤哥倫比亞冰川的變化已超過30年。哥倫比亞冰川是一個大型的潮水冰川,最終流入大海。
由Landsat系列衛星捕獲的假彩色影象顯示了自1986年以來冰川及其周圍景觀的變化。影象由以下感測器收集—專題製圖儀(TM),增強型專題製圖儀(ETM +)和陸地成像儀(OLI)—來自四種不同的Landsat衛星(4,7和8)。
Landsat影象結合了電磁波譜的短波紅外,近紅外和綠光波段。通過這種波長組合,雪和冰呈現明亮的青色,植被為綠色,云為白色或淺橙色,水體為深藍色。暴露的基岩呈棕色,而冰川表面的岩石碎片呈灰色。
在過去三十年裡,終點站向北退縮了20公里。在某些年份,終點站退縮了一公里以上,但速度不均勻。例如,終點站的運動在2000年至2006年之間停滯不前,因為大努納塔克峰和卡丁峰(直接向西)限制了冰川的運動並將冰塊固定。自20世紀80年代以來,冰川已經失去了其總厚度和體積的一半左右(譯自Landsat官網)。
folium是Python中一個繪製地圖的模組,並可以在地圖(底圖)上打點,畫圈,做顏色標記的工具類。簡單易學,和pandas可以很好的融合,是地圖視覺化的一款神器。
在命令列中直接線上安裝即可,快速、簡潔、方便、高效。
pip install folium
這個開源庫中有許多來自OpenStreetMap、MapQuest Open、MapQuestOpen Aerial、Mapbox和Stamen的內建地圖元件,而且支援使用Mapbox或Cloudmade的API金鑰來定製個性化的地圖元件。Folium支援GeoJSON和TopoJSON兩種檔案格式的疊加,也可以將資料連線到這兩種檔案格式的疊加層,最後可使用color-brewer配色方案建立分佈圖。
本節先來展示一下它的簡單應用,主要以2018年1月全國1000多個PM2.5地面觀測站點為例,將這些資料以熱力圖(heat map)的形式展現給大家,並生成相應的html檔案。
程式碼實現:
# _*_ coding: utf-8 _*_ __author__ = 'xbr' __date__ = '2019/1/9 15:47' import numpy as np import pandas as pd import folium import webbrowser from folium.plugins import HeatMap # 讀取csv檔案,以Dataframe形式儲存 df = pd.read_csv(r"D:\data\PM25-20180101.csv") # 獲取資料個數 num = df.shape[0] # 獲取緯度 lat = np.array(df["lat"][0:num]) # 獲取經度 lon = np.array(df["lon"][0:num]) # 獲取PM2.5,轉化為numpy浮點型 pm25 = np.array(df["PM25"][0:num],dtype=float) # 將資料製作成[lats,lons,weights]的形式 data1 = [[lat[i],pm25[i]] for i in range(num)] # 繪製Map,中心經緯度[32,120],開始縮放程度是5倍 map_osm = folium.Map(location=[32,zoom_start=5) # 將熱力圖新增到前面建立的map裡 HeatMap(data1).add_to(map_osm) file_path = r"D:\AirQualityMap.html" # 儲存為html檔案 map_osm.save(file_path) # 預設瀏覽器開啟 webbrowser.open(file_path)
結果圖:
對結果圖區域性放大:
對結果圖區域性放大:
縮小後全景圖:
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援我們。如有錯誤或未考慮完全的地方,望不吝賜教。