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数据集的格式如下;

import json

import folium
import pandas as pd
import requests
url = (
    "https://raw.githubusercontent.com/python-visualization/folium/master/examples/data"
)
us_states = f"{url}/us-states.json"
geo_json_data = json.loads(requests.get(us_states).text) #边界

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) 放置标签

m = folium.Map([43, -100], zoom_start=4, tiles="stamentonerbackground")

folium.GeoJson(geo_json_data).add_to(m)

folium.map.CustomPane("labels").add_to(m)  #放置1

# Final layer associated to custom pane via the appropriate kwarg
folium.TileLayer("stamentonerlabels", pane="labels").add_to(m)  #放置2

m

在这里插入图片描述
逐步放大可显示各个州的名称。

7.图标分层–FeatureGroup.ipynb
LayerControl()–使得图标可展示可不展示

8.加各种形状图标以及画子图—Features.ipynb
(1)画图标:ColorLine–画圆

(2)Marker:标记属性,标记大小,位置,标记点击显示提示内容…

(3)子图:

mport branca

N = 100

multi_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库包含地理数据:

import geopandas

gdf = geopandas.read_file(us_states)

m = folium.Map([43, -100], zoom_start=4)

folium.GeoJson(
    gdf,
).add_to(m)

m

(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:是否在地图打开时就显示层,默认为True

e.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 plugins


m = 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())

m

22.画封闭图形(点连线成面)–Polygons_from_list_of_points.ipynb

23.SmoothFactor.ipynb–边界线平滑
默认情况下,单张中的折线对象是平滑的。这将从行中删除点,在绘图时减少浏览器的负载。
平滑的级别可以在创建任何Polyline对象时通过smoothFactor作为一个选项来指定。在folium中,平滑的级别可以在初始化GeoJson、TopoJson和Choropleth对象时通过传递smooth_factor作为参数来确定。平滑水平没有上界和下界;传单的默认值是1。

folium.TopoJson(
    data=topo,
    object_path="objects.antarctic_ice_shelf",
    name="default_smoothing",
    smooth_factor=10,  #1的时候不平滑,10的时候,在放大时是很平滑
    style_function=lambda x: {"color": "#004c00", "opacity": "0.7"},
).add_to(m)

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揭秘美国选民的总统喜好】的应用~~
(加※号的在里面有更具体的实践)

好的,这里是基于 DBSCAN 算法对多个 .plt 轨迹数据文件进行聚类,并以 folium 高德地图可视化轨迹数据的代码实现: 首先,需要安装 folium、pandas、numpy、scikit-learn 。 ```python !pip install folium pandas numpy scikit-learn ``` 然后,按照以下步骤进行操作: 1. 导入所需: ```python import os import pandas as pd import numpy as np from sklearn.cluster import DBSCAN import folium from folium.plugins import HeatMap ``` 2. 定义函数来读取数据并将其转换为用于聚类的格式: ```python def read_file(file_path): data = pd.read_csv(file_path, skiprows=6, header=None, names=['lat', 'lon', 'zero', 'alt', 'days', 'date', 'time']) data = data.drop(['zero', 'alt'], axis=1) data = data.dropna() data['datetime'] = pd.to_datetime(data['days'].astype(int).astype(str) + ' ' + data['time']) data['lat'] = data['lat'].astype(float) data['lon'] = data['lon'].astype(float) data = data.drop(['days', 'date', 'time'], axis=1) return np.array(data[['lat', 'lon']].values.tolist()) ``` 3. 定义函数来执行聚类: ```python def perform_clustering(data, eps, min_samples): db = DBSCAN(eps=eps, min_samples=min_samples, algorithm='ball_tree', metric='haversine').fit(np.radians(data)) cluster_labels = db.labels_ num_clusters = len(set(cluster_labels)) return cluster_labels, num_clusters ``` 4. 定义函数来可视化聚类结果: ```python def visualize_clusters(data, cluster_labels, num_clusters): m = folium.Map(location=[data[:, 0].mean(), data[:, 1].mean()], zoom_start=12) colors = ['red', 'blue', 'green', 'purple', 'orange', 'darkred', 'lightred', 'beige', 'darkblue', 'darkgreen', 'cadetblue', 'darkpurple', 'pink', 'lightblue', 'lightgreen', 'gray', 'black', 'lightgray'] for i in range(num_clusters): cluster_data = data[cluster_labels == i] if len(cluster_data) > 0: HeatMap(cluster_data, radius=15, blur=10, max_zoom=13, gradient={0.4: colors[i % len(colors)]}).add_to(m) return m ``` 5. 遍历文件夹中的所有文件并聚类它们: ```python file_path = 'geolife_sample' # 数据文件夹路径 eps = 100 # 聚类半径 min_samples = 10 # 最小样本数 for file_name in os.listdir(file_path): if file_name.endswith('.plt'): file_full_path = os.path.join(file_path, file_name) data = read_file(file_full_path) cluster_labels, num_clusters = perform_clustering(data, eps, min_samples) m = visualize_clusters(data, cluster_labels, num_clusters) html_file_path = file_full_path.replace('.plt', '.html') m.save(html_file_path) ``` 这将为每个 .plt 文件创建一个 HTML 文件,其中包含可视化的聚类结果。 希望这可以帮助您实现您的项目!
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值