Folium的基本用法
Folium是建立在Python系统数据整理(Datawrangling)和Leaflet.js库映射之上的开源库。用Python处理数据,然后Leaflet地图上进行可视化。
Folium能够将Python处理后的数据轻松地在交互式的Leaflet地图上进行可视化展示。它不单单可以在地图上展示数据的分布图,还可以使用Vincent/Vega在地图上加以标记。
这个开源库中有许多来自OpenStreetMap、MapQuest Open、MapQuestOpen Aerial、Mapbox和Stamen的内建地图元件,而且支持使用Mapbox或Cloudmade的API密钥来定制个性化的地图元件。Folium支持GeoJSON和TopoJSON两种文件格式的叠加,也可以将数据连接到这两种文件格式的叠加层,最后使用color-brewer配色方案创建分布图。
开始创建地图
创建底图,传入起始坐标到Folium地图中:
In [1]:
import folium
map_osm = folium.Map(location=[45.5236, -122.6750])
map_osm.save(‘/tmp/xx_osm.html’)
Folium默认使用的是OpenStreetMap地图切片,但是也可以使用 Stamen Terrain, Stamen Toner, Mapbox Bright 和 MapboxControl 数据源,使用的时候需要指定 tiles 关键词:输入位置(location),切片(tiles),缩放比例(zoom):
In [2]:
stamen = folium.Map(location=[45.5236, -122.6750], tiles=’Stamen Toner’, zoom_start=13)
stamen.save(‘/tmp/xx_stamen_toner.html’)
Folium也支持Cloudmade 和 Mapbox个性化定制的地图元件,只需简单地传入API_key :
In [3]:
custom = folium.Map(location=[45.5236, -122.6750], tiles=’Mapbox’,
API_key=’pk.eyJ1IjoiYnVrdW4iLCJhIjoiY2lqeWFjZmo4MXFubndka2lzcnZ1M2tzciJ9.C1dZUQkRZSIEKfg-DaFYpw’)
最后,Folium支持传入任何与Leaflet.js兼容的个性化地图元件:
In [4]:
tileset = r’http://{s}.tiles.yourtiles.com/{z}/{x}/{y}.png’
map = folium.Map(location=[45.372, -121.6972], zoom_start=12,
tiles=tileset, attr=’My Data Attribution’)
地图标记
Folium支持多种标记类型的绘制,下面从一个简单的Leaflet类型位置标记弹出文本开始:
In [5]:
map_1 = folium.Map(location=[45.372, -121.6972], zoom_start=12, tiles=’Stamen Terrain’)
folium.Marker([45.3288, -121.6625], popup=’Mt. Hood Meadows’).add_to(map_1)
folium.Marker([45.3311, -121.7113], popup=’Timberline Lodge’).add_to(map_1)
map_1.save(‘/tmp/xx_mthood.html’)
Folium支持多种颜色和标记图标类型:
In [6]:
map_1 = folium.Map(location=[45.372, -121.6972], zoom_start=12,tiles=’Stamen Terrain’)
folium.Marker([45.3288, -121.6625], popup=’Mt. Hood Meadows’,
icon = folium.Icon(icon = ‘cloud’)).add_to(map_1)
folium.Marker([45.3311, -121.7113], popup=’Timberline Lodge’,
icon = folium.Icon(color =’green’)).add_to(map_1)
folium.Marker([45.3300, -121.6823], popup=’Some Other Location’,
icon = folium.Icon(color =’red’)).add_to(map_1)
# map_1.save(‘/tmp/xx_iconTest.html’)
Out[6]:
Folium也支持使用个性化的尺寸和颜色进行圆形标记:
In [7]:
map_2 = folium.Map(location=[45.5236, -122.6750], tiles=’Stamen Toner’,
zoom_start=13)
folium.Marker(location=[45.5244, -122.6699], popup=’The Waterfront’).add_to(map_2)
folium.CircleMarker(location=[45.5215, -122.6261], radius=500,
popup=’Laurelhurst Park’, color=’#3186cc’,
fill_color=’#3186cc’).add_to(map_2)
map_2.save(‘/tmp/xx_portland.html’)
Folium有一个简便的功能:可以使经/纬度悬浮显示在地图上:
In [8]:
map_3 = folium.Map(location=[46.1991, -122.1889], tiles=’Stamen Terrain’,
zoom_start=13)
folium.LatLngPopup().add_to(map_3)
map_3.save(‘/tmp/xx_sthelens.html’)
# map_3
Click-for-marker功能允许标记动态放置:
In [9]:
map_4 = folium.Map(location=[46.8527, -121.7649], tiles=’Stamen Terrain’,
zoom_start=13)
folium.Marker(location=[46.8354, -121.7325], popup=’Camp Muir’).add_to(map_4)
folium.ClickForMarker(popup=’Waypoint’).add_to(map_4)
map_4.save(‘/tmp/xx_mtrainier.html’)
# map_4
Folium也支持来自Leaflet-DVF(Data Visualization Framework,数据可视化框架)的Polygon(多边形)标记集:
In [10]:
map_5 = folium.Map(location=[45.5236, -122.6750], zoom_start=13)
folium.RegularPolygonMarker(location=[45.5012, -122.6655], popup=’Ross Island Bridge’,
fill_color=’#132b5e’, number_of_sides=3, radius=10).add_to(map_5)
folium.RegularPolygonMarker(location=[45.5132, -122.6708], popup=’Hawthorne Bridge’,
fill_color=’#45647d’, number_of_sides=4, radius=10).add_to(map_5)
folium.RegularPolygonMarker(location=[45.5275, -122.6692], popup=’Steel Bridge’,
fill_color=’#769d96′, number_of_sides=6, radius=10).add_to(map_5)
folium.RegularPolygonMarker(location=[45.5318, -122.6745], popup=’Broadway Bridge’,
fill_color=’#769d96′, number_of_sides=8, radius=10).add_to(map_5)
map_5.save(‘/tmp/xx_bridges.html’)
# map_5
Leaflet DVF是Leaflet JavaScript映射库的扩展。该框架的主要目标是简化使用Leaflet的数据可视化和主题映射,从而更轻松地将原始数据转换为引人入胜的地图。
Folim 进阶用法
Vincent/Vega标记
Folium可通过vincent 进行任何类型的标记,并将标记悬浮在地图上。
单击出会出现框图。
Vincent:一个从Python到Vega的翻译器
Vega让D3建立可视化变得容易,而Vincent让Python建立Vega变得容易。Vincent接收Python数据结构并把它们翻译成Vega的可视化语法。通过对语法元素的获取和设置,它允许可视化设计的快速迭代,并把最终可视化结果输出到JSON。最重要的是,Vincent以一种直观的方式与Pandas DataFrames和Series相通。
详细信息请参考:https://vincent.readthedocs.org/en/latest/
In [11]:
import json
import folium
buoy_map = folium.Map(location=[46.3014, -123.7390], zoom_start=7,tiles=’Stamen Terrain’)
popup1 = folium.Popup(max_width=800,).add_child(folium.Vega( json.load(open(‘/gdata/folium/data/vis1.json’)), width=500, height=250))
folium.RegularPolygonMarker([47.3489, -124.708], fill_color=’#43d9de’, radius=12, popup=popup1).add_to(buoy_map)
Out[11]:
In [12]:
popup2 = folium.Popup(max_width=800,).add_child(folium.Vega(json.load(open(‘/gdata/folium/data/vis2.json’)), width=500, height=250))
folium.RegularPolygonMarker([44.639, -124.5339], fill_color=’#43d9de’, radius=12, popup=popup2).add_to(buoy_map)
popup3 = folium.Popup(max_width=800,).add_child(folium.Vega(json.load(open(‘/gdata/folium/data/vis3.json’)), width=500, height=250))
folium.RegularPolygonMarker([46.216, -124.1280], fill_color=’#43d9de’, radius=12, popup=popup3).add_to(buoy_map)
buoy_map.save(‘/tmp/xx_NOAA_buoys.html’)
# buoy_map
GeoJSON/TopoJSON层叠加
GeoJSON 和TopoJSON层都可以导入地图,不同的层可以在同一张地图上可视化出来:
In [13]:
geo_path = ‘/gdata/folium/data/antarctic_ice_edge.json’
topo_path = ‘/gdata/folium/data/antarctic_ice_shelf_topo.json’
ice_map = folium.Map(location=[-59.1759, -11.6016],
tiles=’Mapbox Bright’, zoom_start=2)
# ice_map.choropleth(geo_path=geo_path)
# ice_map.choropleth(geo_path=topo_path, topojson=’objects.antarctic_ice_shelf’)
# ice_map.save(‘/tmp/xx_ice_map.html’)
# ice_map
分布图
Folium允许PandasDataFrames/Series类型和Geo/TopoJSON类型之间的数据转换。Color Brewer 颜色方案也是内建在这个库,可以直接地导入快速可视化的不同组合:
In [14]:
import folium
import pandas as pd
state_geo = ‘/gdata/folium/data/us-states.json’
state_unemployment = ‘/gdata/folium/data/US_Unemployment_Oct2012.csv’
state_data = pd.read_csv(state_unemployment)
#Let Folium determine the scale
map1 = folium.Map(location=[48, -102], zoom_start=3)
基于D3阈值尺度,Folium在右上方创建图例,通过分位数创建最佳猜测值,使得导入设定的阈值简单化:
In [15]:
map2 = folium.Map(location=[48, -102], zoom_start=3)
通过Pandas DataFrame进行数据处理,可以快速可视化不同的数据集。下面的例子中,df DataFrame包含6列不同的经济数据,我们将在下面可视化一部分数据:
2011年就业率分布图
In [16]:
import helper; helper.info()
页面更新时间: 2019-02-28 18:59:17
操作系统/OS: Linux-4.9.0-8-amd64-x86_64-with-debian-9.8
Python: 3.5.3