Folium库使用心得(一)
參考代碼:https://nbviewer.jupyter.org/github/python-visualization/folium/tree/master/examples/
初次接觸阿里云的天池實驗室,對【入門級-用Pandas揭秘美國選民的總統喜好】中的熱力圖可視化各州捐款數,進行 菜鳥 實踐,特別用到了python中的Folium庫,打開了新世界的大門。由于之前實踐過高德API,也發現Folium庫算是地圖的底層。(有關地圖的庫,實際應該還有其他,還未逐一實踐)
以下主要總結個人針對Folium庫的實踐經歷,特別是熱力圖、時間軸和時序數據的繪制,其中也會摻雜其他一些pandas,datetime小tip。
具體請結合【參考代碼】
1.地圖初始化:
m = folium.Map([43, -100], tiles="stamentonerbackground", zoom_start=4)對應:中心點位置,地圖樣式,地圖放大級別
【地圖樣式選擇: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", #邊界線設置}, ).add_to(m)自定義地圖層顏色,引入geo_json_date數據集,是對美國各州邊界的劃分。設置顏色函數,對區域進行填充。
針對geo_json_date數據集的格式如下;
folium對于美國各州繪制的數據格式為:
{‘type’: ‘FeatureCollection’,
‘features’: [{‘type’: ‘Feature’,
‘id’: ‘AL’, –州簡稱
‘properties’: {‘name’: ‘Alabama’},–州全稱
‘geometry’: {‘type’: ‘Polygon’,–州的形狀
‘coordinates’: [[[-87.359296, 35.00118], –邊界點
[-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.放置標記–ContinuousWorld.ipynb
folium.Marker(location=[0, 0], popup="I will disapear when moved outside the wrapped map domain." ).add_to(m)對應 放置位置,點擊后marker的話語,
5.放置圖片–CustomIcon.ipynb
※6. 放置標簽–CustomPanes.ipynb
(1)未放置標簽:
m = folium.Map([43, -100], zoom_start=4, tiles="stamentoner")folium.GeoJson(geo_json_data).add_to(m)m
(2) 放置標簽
逐步放大可顯示各個州的名稱。
7.圖標分層–FeatureGroup.ipynb
LayerControl()–使得圖標可展示可不展示
8.加各種形狀圖標以及畫子圖—Features.ipynb
(1)畫圖標:ColorLine–畫圓
(2)Marker:標記屬性,標記大小,位置,標記點擊顯示提示內容…
(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兩個地圖+兩個散點圖
(4)GeoJson:一次性添加多個marker
9.FloatImage.ipynb–地圖上添加圖片
10.GeoJSONWithoutTitles.ipynb–背景自定義(可以加柵格,但是柵格大小會變)
※11. 地理數據處理及熱力圖(區域)-- GeoJSON_and_choropleth.ipynb
(1)數據準備:上面的GeoJson或者geopandas庫
geopandas庫包含地理數據:
(2)點擊地圖某一位置,自動放大-- 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)自定義顯示顏色
#提供函數的好處在于,您可以根據特性指定樣式。例如,如果你想用綠色顯示所有名字中包含字母“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)熱力圖(區域)–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這個類可以將GeoJSON的圖形覆蓋到地圖上。如果不綁定數據則顯示單色的地圖,如果綁定數據則通過值得大小顯示不同顏色。具體使用方法:
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)參數說明:
geo_data:指定GeoJSON,可以是JsonURL、file path或其他類型 (json、dict、geopandas等)的GeoJSON幾何數據 data:需要綁定的GeoJSON的數據,默認為空。傳入的數據可以是Pandas DataFrame或Series,具體Series沒有使用過,拆測如果傳Series需要將index設置為匹配項。 columns:當數據傳入的時Pandas DataFrame設定想要的值,第一列需要與GeoJSON匹配的列,第二列為具體的值 key_on:GeoJSON中需要綁定的列,默認為空。格式中需要以feature對象開頭,如id或 feature.properties.statename bins:設定對值要劃分的數量,默認為6,如果傳入的是數值,則傳入數字時,會使用data中的最大值和最小值進行平均劃分。如果傳入的是一個序列,則會按序列定義邊界。同時也可以傳入字符串,可傳入的字符串可以從histogram的文檔中找到。 fill_color:區域需要填充的顏色,默認為blue,可以傳入16進制的顏色代碼或顏色名稱,如果綁定了數據,則可以傳入“顏色地圖”,比如:‘BuGn’, ‘BuPu’, ‘GnBu’, ‘OrRd’, ‘PuBu’, ‘PuBuGn’, ‘PuRd’, ‘RdPu’, ‘YlGn’, ‘YlGnBu’, ‘YlOrBr’, and ‘YlOrRd’. nan_fill_color:NaN區域填充的顏色,默認為’black’,即GeoJSON中沒有匹配到的圖形填充的顏色。 fill_opacity :填充顏色的透明度,默認為6,可選值為0-1 nan_fill_opacity:NaN區域填充顏色透明度,默認取fill_opacity的值。 line_color:區域邊框顏色,默認為’black’ line_weight:區域邊框款對,默認為1 line_opacity:區域邊框透明度,默認為1 legend_name:圖例標識名稱 topojson:除了GeoJson外,同時也支持TopoJSON格式的的邊界數據。 (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:平滑因子,主要為了簡化每個縮放級別的折線。數值越大表示越平滑,同時性能也更好,數值越小說明越精確,Leaflet中的默認值為0 highlight:當鼠標懸停在區域上時是否要突出顯示,默認為False name:層的名字,可選。如果設置了可以在LayerControls中出現。 overlay:添加層的設置,默認為True(覆蓋層),如果傳False則為基礎層。 control:是否將圖層包含到LayerControls中,默認為True show:是否在地圖打開時就顯示層,默認為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.在每個邊界對象上顯示注釋–GeoJsonPopupAndTooltip.ipynb
【這里主要涉及對DataFrame對象的處理】
(覺得畫出來的還挺好看的,但是未實踐,待補)
13.熱力圖(點狀)–HeatMapWithTime.ipynb,Heatmap.ipynb
可以隨時間變化顯示點的熱力情況
后續會有基于區域熱力圖進行詳細試驗,主要涉及時序數據的處理。
14.地圖畫線-- Highlight_Function.ipynb
15.ImageOverlay.ipynb
16.畫多組Marker–MarkerCluster.ipynb
17.添加多個圓–MinMaxLimits.ipynb
18.地圖中加小地圖–MiniMap.ipynb
19.在設定位置上加圖表式的圖標–Minicharts.ipynb
可以直觀反映這個地方某方面的占比
20.點聚合–Plugins.ipynb
放置多個Marker,放大zoom時,可以將點聚合,顯示這一區域有對應幾個Marker
21.加各種形狀的線以及流動的線-- PolyLineTextPath_AntPath.ipynb
import folium from folium import pluginsm = folium.Map([30, 0], zoom_start=3) ##流動線的數據形式,注意經緯度放置順序 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.畫封閉圖形(點連線成面)–Polygons_from_list_of_points.ipynb
23.SmoothFactor.ipynb–邊界線平滑
默認情況下,單張中的折線對象是平滑的。這將從行中刪除點,在繪圖時減少瀏覽器的負載。
平滑的級別可以在創建任何Polyline對象時通過smoothFactor作為一個選項來指定。在folium中,平滑的級別可以在初始化GeoJson、TopoJson和Choropleth對象時通過傳遞smooth_factor作為參數來確定。平滑水平沒有上界和下界;傳單的默認值是1。
smooth_factor為平滑程度,隨著地圖的放大加載,邊界顯示越來越曲折。
24.地圖樣式類型–TilesExample.ipynb
※25.時間軸熱力圖(區域)–TimeSliderChoropleth.ipynb
后續以入門賽為背景詳講
26.在圖層上畫圓–VectorLayers.ipynb
27.自定義畫圖形–plugin-Draw.ipynb
28.地圖寬高設置-- WidthHeight.ipynb
29.搜索功能–plugin-Search.ipynb
輸入城市名字,會地圖展現至對應地方
感覺高德API中很多功能和Folium如出一轍,只是高德有更準確的地理數據,操作簡潔,頁面美觀。Folium庫的功能,高德上大部分都有對應的(時間軸的好像沒有,一般例如加標記,搜索,路線圖,熱力圖,聚合等等高德都是有的)。
但是高德只能做固定結果的呈現。對Folium,可以自己改代碼,跑代碼,更進一步體會Python的魅力~
后面寫Folium在【入門級-用Pandas揭秘美國選民的總統喜好】的應用~~
(加※號的在里面有更具體的實踐)
總結
以上是生活随笔為你收集整理的Folium库使用心得(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android强制在主线程进行网络请求
- 下一篇: 简单编程题