Folium库使用心得(一)
參考代碼:https://nbviewer.jupyter.org/github/python-visualization/folium/tree/master/examples/
初次接觸阿里云的天池實(shí)驗(yàn)室,對(duì)【入門(mén)級(jí)-用Pandas揭秘美國(guó)選民的總統(tǒng)喜好】中的熱力圖可視化各州捐款數(shù),進(jìn)行 菜鳥(niǎo) 實(shí)踐,特別用到了python中的Folium庫(kù),打開(kāi)了新世界的大門(mén)。由于之前實(shí)踐過(guò)高德API,也發(fā)現(xiàn)Folium庫(kù)算是地圖的底層。(有關(guān)地圖的庫(kù),實(shí)際應(yīng)該還有其他,還未逐一實(shí)踐)
 以下主要總結(jié)個(gè)人針對(duì)Folium庫(kù)的實(shí)踐經(jīng)歷,特別是熱力圖、時(shí)間軸和時(shí)序數(shù)據(jù)的繪制,其中也會(huì)摻雜其他一些pandas,datetime小tip。
 具體請(qǐng)結(jié)合【參考代碼】
1.地圖初始化:
m = folium.Map([43, -100], tiles="stamentonerbackground", zoom_start=4)對(duì)應(yīng):中心點(diǎn)位置,地圖樣式,地圖放大級(jí)別
 【地圖樣式選擇:stamentonerbackground,cartodbpositron,OpenStreetMap…(第24條)】
2.地圖自定義–Colormaps.ipynb
def my_color_function(feature):"""Maps low values to green and high values to red."""if unemployment_dict[feature["id"]] > 6.5:return "#ff0000"else:return "#008000" m = folium.Map([43, -100], tiles="cartodbpositron", zoom_start=4)folium.GeoJson(geo_json_data,style_function=lambda feature: {"fillColor": my_color_function(feature),"color": "black","weight": 2,"dashArray": "5, 5", #邊界線設(shè)置}, ).add_to(m)自定義地圖層顏色,引入geo_json_date數(shù)據(jù)集,是對(duì)美國(guó)各州邊界的劃分。設(shè)置顏色函數(shù),對(duì)區(qū)域進(jìn)行填充。
 針對(duì)geo_json_date數(shù)據(jù)集的格式如下;
folium對(duì)于美國(guó)各州繪制的數(shù)據(jù)格式為:
 {‘type’: ‘FeatureCollection’,
 ‘features’: [{‘type’: ‘Feature’,
 ‘id’: ‘AL’, –州簡(jiǎn)稱(chēng)
 ‘properties’: {‘name’: ‘Alabama’},–州全稱(chēng)
 ‘geometry’: {‘type’: ‘Polygon’,–州的形狀
 ‘coordinates’: [[[-87.359296, 35.00118], –邊界點(diǎn)
 [-85.606675, 34.984749],
 [-85.431413, 34.124869],
 [-85.184951, 32.859696]…]]}},
 {‘type’: ‘Feature’,
 ‘id’: ‘AK’,
 ‘properties’: {‘name’: ‘Alaska’},
 ‘geometry’: {‘type’: ‘MultiPolygon’,
 ‘coordinates’: [[[[-131.602021, 55.117982],…
3.漸變色選擇–Colormaps.ipynb
 OrRd_09 等等
4.放置標(biāo)記–ContinuousWorld.ipynb
folium.Marker(location=[0, 0], popup="I will disapear when moved outside the wrapped map domain." ).add_to(m)對(duì)應(yīng) 放置位置,點(diǎn)擊后marker的話(huà)語(yǔ),
5.放置圖片–CustomIcon.ipynb
※6. 放置標(biāo)簽–CustomPanes.ipynb
(1)未放置標(biāo)簽:
m = folium.Map([43, -100], zoom_start=4, tiles="stamentoner")folium.GeoJson(geo_json_data).add_to(m)m
 (2) 放置標(biāo)簽
 逐步放大可顯示各個(gè)州的名稱(chēng)。
7.圖標(biāo)分層–FeatureGroup.ipynb
 LayerControl()–使得圖標(biāo)可展示可不展示
8.加各種形狀圖標(biāo)以及畫(huà)子圖—Features.ipynb
 (1)畫(huà)圖標(biāo):ColorLine–畫(huà)圓
(2)Marker:標(biāo)記屬性,標(biāo)記大小,位置,標(biāo)記點(diǎn)擊顯示提示內(nèi)容…
(3)子圖:
mport brancaN = 100multi_iter2 = {"x": np.random.uniform(size=(N,)),"y": np.random.uniform(size=(N,)), }scatter = vincent.Scatter(multi_iter2, iter_idx="x", height=250, width=420) data = json.loads(scatter.to_json())f = branca.element.Figure()# Create two maps. m = folium.Map(location=[0, 0],tiles="stamenwatercolor",zoom_start=1,position="absolute",left="0%",width="50%",height="50%", )m2 = folium.Map(location=[46, 3],tiles="OpenStreetMap",zoom_start=4,position="absolute",left="50%",width="50%",height="50%",top="50%", )# Create two Vega. v = features.Vega(data, position="absolute", left="50%", width="50%", height="50%")v2 = features.Vega(data, position="absolute", left="0%", width="50%", height="50%", top="50%" )f.add_child(m) f.add_child(m2) f.add_child(v) f.add_child(v2)f兩個(gè)地圖+兩個(gè)散點(diǎn)圖
 
 (4)GeoJson:一次性添加多個(gè)marker
9.FloatImage.ipynb–地圖上添加圖片
10.GeoJSONWithoutTitles.ipynb–背景自定義(可以加?xùn)鸥?#xff0c;但是柵格大小會(huì)變)
※11. 地理數(shù)據(jù)處理及熱力圖(區(qū)域)-- GeoJSON_and_choropleth.ipynb
 (1)數(shù)據(jù)準(zhǔn)備:上面的GeoJson或者geopandas庫(kù)
 geopandas庫(kù)包含地理數(shù)據(jù):
(2)點(diǎn)擊地圖某一位置,自動(dòng)放大-- zoom_on_click
m = folium.Map([43, -100], zoom_start=4)folium.GeoJson(geo_json_data, zoom_on_click=True).add_to(m)m(3)自定義顯示顏色
#提供函數(shù)的好處在于,您可以根據(jù)特性指定樣式。例如,如果你想用綠色顯示所有名字中包含字母“E”的州,只需: m = folium.Map([43, -100], zoom_start=4)folium.GeoJson(geo_json_data,style_function=lambda feature: {"fillColor": "green"if "e" in feature["properties"]["name"].lower()else "#ffff00","color": "black","weight": 2,"dashArray": "5, 5",}, ).add_to(m)m※(4)熱力圖(區(qū)域)–Choropleth
m = folium.Map([43, -100], zoom_start=4)folium.Choropleth(geo_data=us_states,fill_opacity=0.3,line_weight=2, ).add_to(m)m這個(gè)類(lèi)可以將GeoJSON的圖形覆蓋到地圖上。如果不綁定數(shù)據(jù)則顯示單色的地圖,如果綁定數(shù)據(jù)則通過(guò)值得大小顯示不同顏色。具體使用方法:
class folium.features.Choropleth(geo_data, data=None, columns=None, key_on=None, bins=6, fill_color=None, nan_fill_color='black', fill_opacity=0.6, nan_fill_opacity=None, line_color='black', line_weight=1, line_opacity=1, name=None, legend_name='', overlay=True, control=True, show=True, topojson=None, smooth_factor=None, highlight=None, **kwargs)參數(shù)說(shuō)明:
geo_data:指定GeoJSON,可以是JsonURL、file path或其他類(lèi)型 (json、dict、geopandas等)的GeoJSON幾何數(shù)據(jù) data:需要綁定的GeoJSON的數(shù)據(jù),默認(rèn)為空。傳入的數(shù)據(jù)可以是Pandas DataFrame或Series,具體Series沒(méi)有使用過(guò),拆測(cè)如果傳Series需要將index設(shè)置為匹配項(xiàng)。 columns:當(dāng)數(shù)據(jù)傳入的時(shí)Pandas DataFrame設(shè)定想要的值,第一列需要與GeoJSON匹配的列,第二列為具體的值 key_on:GeoJSON中需要綁定的列,默認(rèn)為空。格式中需要以feature對(duì)象開(kāi)頭,如id或 feature.properties.statename bins:設(shè)定對(duì)值要?jiǎng)澐值臄?shù)量,默認(rèn)為6,如果傳入的是數(shù)值,則傳入數(shù)字時(shí),會(huì)使用data中的最大值和最小值進(jìn)行平均劃分。如果傳入的是一個(gè)序列,則會(huì)按序列定義邊界。同時(shí)也可以傳入字符串,可傳入的字符串可以從histogram的文檔中找到。 fill_color:區(qū)域需要填充的顏色,默認(rèn)為blue,可以傳入16進(jìn)制的顏色代碼或顏色名稱(chēng),如果綁定了數(shù)據(jù),則可以傳入“顏色地圖”,比如:‘BuGn’, ‘BuPu’, ‘GnBu’, ‘OrRd’, ‘PuBu’, ‘PuBuGn’, ‘PuRd’, ‘RdPu’, ‘YlGn’, ‘YlGnBu’, ‘YlOrBr’, and ‘YlOrRd’. nan_fill_color:NaN區(qū)域填充的顏色,默認(rèn)為’black’,即GeoJSON中沒(méi)有匹配到的圖形填充的顏色。 fill_opacity :填充顏色的透明度,默認(rèn)為6,可選值為0-1 nan_fill_opacity:NaN區(qū)域填充顏色透明度,默認(rèn)取fill_opacity的值。 line_color:區(qū)域邊框顏色,默認(rèn)為’black’ line_weight:區(qū)域邊框款對(duì),默認(rèn)為1 line_opacity:區(qū)域邊框透明度,默認(rèn)為1 legend_name:圖例標(biāo)識(shí)名稱(chēng) topojson:除了GeoJson外,同時(shí)也支持TopoJSON格式的的邊界數(shù)據(jù)。 (string, default None) – If using a TopoJSON, passing “objects.yourfeature” to the topojson keyword argument will enable conversion to GeoJSON. TopoJSONs can be passed as “geo_data”, but the “topojson” keyword must also be passed with the reference to the topojson objects to convert. See the topojson.feature method in the TopoJSON API reference: https://github.com/topojson/topojson/wiki/API-Reference smooth_factor:平滑因子,主要為了簡(jiǎn)化每個(gè)縮放級(jí)別的折線。數(shù)值越大表示越平滑,同時(shí)性能也更好,數(shù)值越小說(shuō)明越精確,Leaflet中的默認(rèn)值為0 highlight:當(dāng)鼠標(biāo)懸停在區(qū)域上時(shí)是否要突出顯示,默認(rèn)為False name:層的名字,可選。如果設(shè)置了可以在LayerControls中出現(xiàn)。 overlay:添加層的設(shè)置,默認(rèn)為True(覆蓋層),如果傳False則為基礎(chǔ)層。 control:是否將圖層包含到LayerControls中,默認(rèn)為True show:是否在地圖打開(kāi)時(shí)就顯示層,默認(rèn)為Truee.g.:
import folium import pandas as pd geo_json_data = "data/china_city.json" df = pd.read_excel("data/orders.xlsx") m = folium.Map(location=[32, 120], zoom_start=5) folium.Choropleth(geo_data=geo_json_data,data=df,columns=["cityname", "order_count"],key_on="feature.properties.name",fill_color="BuPu",fill_opacity=0.7,line_opacity=0.2,legend_name="Order Count", ).add_to(m)12.在每個(gè)邊界對(duì)象上顯示注釋–GeoJsonPopupAndTooltip.ipynb
 【這里主要涉及對(duì)DataFrame對(duì)象的處理】
 (覺(jué)得畫(huà)出來(lái)的還挺好看的,但是未實(shí)踐,待補(bǔ))
13.熱力圖(點(diǎn)狀)–HeatMapWithTime.ipynb,Heatmap.ipynb
 可以隨時(shí)間變化顯示點(diǎn)的熱力情況
 后續(xù)會(huì)有基于區(qū)域熱力圖進(jìn)行詳細(xì)試驗(yàn),主要涉及時(shí)序數(shù)據(jù)的處理。
14.地圖畫(huà)線-- Highlight_Function.ipynb
15.ImageOverlay.ipynb
16.畫(huà)多組Marker–MarkerCluster.ipynb
17.添加多個(gè)圓–MinMaxLimits.ipynb
18.地圖中加小地圖–MiniMap.ipynb
19.在設(shè)定位置上加圖表式的圖標(biāo)–Minicharts.ipynb
 可以直觀反映這個(gè)地方某方面的占比
20.點(diǎn)聚合–Plugins.ipynb
 放置多個(gè)Marker,放大zoom時(shí),可以將點(diǎn)聚合,顯示這一區(qū)域有對(duì)應(yīng)幾個(gè)Marker
21.加各種形狀的線以及流動(dòng)的線-- PolyLineTextPath_AntPath.ipynb
import folium from folium import pluginsm = folium.Map([30, 0], zoom_start=3) ##流動(dòng)線的數(shù)據(jù)形式,注意經(jīng)緯度放置順序 wind_locations = [[59.35560, -31.992190],[55.178870, -42.89062],[47.754100, -43.94531],[38.272690, -37.96875],[27.059130, -41.13281],[16.299050, -36.56250],[8.4071700, -30.23437],[1.0546300, -22.50000],[-8.754790, -18.28125],[-21.61658, -20.03906],[-31.35364, -24.25781],[-39.90974, -30.93750],[-43.83453, -41.13281],[-47.75410, -49.92187],[-50.95843, -54.14062],[-55.97380, -56.60156], ]wind_line = folium.PolyLine(wind_locations, weight=15, color="#8EE9FF").add_to(m) m = folium.Map()folium.plugins.AntPath(locations=wind_locations, reverse="True", dash_array=[20, 30] ).add_to(m)m.fit_bounds(m.get_bounds())m22.畫(huà)封閉圖形(點(diǎn)連線成面)–Polygons_from_list_of_points.ipynb
23.SmoothFactor.ipynb–邊界線平滑
 默認(rèn)情況下,單張中的折線對(duì)象是平滑的。這將從行中刪除點(diǎn),在繪圖時(shí)減少瀏覽器的負(fù)載。
 平滑的級(jí)別可以在創(chuàng)建任何Polyline對(duì)象時(shí)通過(guò)smoothFactor作為一個(gè)選項(xiàng)來(lái)指定。在folium中,平滑的級(jí)別可以在初始化GeoJson、TopoJson和Choropleth對(duì)象時(shí)通過(guò)傳遞smooth_factor作為參數(shù)來(lái)確定。平滑水平?jīng)]有上界和下界;傳單的默認(rèn)值是1。
smooth_factor為平滑程度,隨著地圖的放大加載,邊界顯示越來(lái)越曲折。
24.地圖樣式類(lèi)型–TilesExample.ipynb
※25.時(shí)間軸熱力圖(區(qū)域)–TimeSliderChoropleth.ipynb
 后續(xù)以入門(mén)賽為背景詳講
26.在圖層上畫(huà)圓–VectorLayers.ipynb
27.自定義畫(huà)圖形–plugin-Draw.ipynb
28.地圖寬高設(shè)置-- WidthHeight.ipynb
29.搜索功能–plugin-Search.ipynb
 輸入城市名字,會(huì)地圖展現(xiàn)至對(duì)應(yīng)地方
感覺(jué)高德API中很多功能和Folium如出一轍,只是高德有更準(zhǔn)確的地理數(shù)據(jù),操作簡(jiǎn)潔,頁(yè)面美觀。Folium庫(kù)的功能,高德上大部分都有對(duì)應(yīng)的(時(shí)間軸的好像沒(méi)有,一般例如加標(biāo)記,搜索,路線圖,熱力圖,聚合等等高德都是有的)。
 但是高德只能做固定結(jié)果的呈現(xiàn)。對(duì)Folium,可以自己改代碼,跑代碼,更進(jìn)一步體會(huì)Python的魅力~
后面寫(xiě)Folium在【入門(mén)級(jí)-用Pandas揭秘美國(guó)選民的總統(tǒng)喜好】的應(yīng)用~~
 (加※號(hào)的在里面有更具體的實(shí)踐)
總結(jié)
以上是生活随笔為你收集整理的Folium库使用心得(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: Android强制在主线程进行网络请求
- 下一篇: 简单编程题
