Folium标记点基于数值区间的颜色映射实现
嘿,我来帮你搞定Folium标记点按DataFrame数值区间配色的问题!其实思路很清晰,就是先把数值映射到对应颜色,再把颜色绑定到标记点上,下面分两种常用场景给你详细说:
场景1:离散数值区间(固定颜色对应固定区间)
如果你想把数值分成几个明确的区间(比如0-10用绿色,11-20用黄色这类),可以用pandas.cut()来完成数值到颜色的映射:
定义区间和对应颜色
先确定你要划分的数值范围,以及每个区间对应的颜色(Folium的Marker Icon支持预设的颜色名称,比如'green'、'yellow'、'orange'、'red'这些):import pandas as pd import folium # 假设你的数据存在df里,包含经纬度列(lat、lon)和目标数值列(比如叫value) bins = [0, 10, 20, 30, float('inf')] # 自定义数值区间 color_labels = ['green', 'yellow', 'orange', 'red'] # 对应每个区间的颜色 # 给df新增一列color,根据value列的数值区间分配颜色 df['marker_color'] = pd.cut(df['value'], bins=bins, labels=color_labels)遍历数据添加带颜色的标记点
接下来创建地图,遍历每一行数据,把分配好的颜色传给Marker的icon参数:# 初始化地图,中心设为数据的平均经纬度 m = folium.Map(location=[df['lat'].mean(), df['lon'].mean()], zoom_start=10) # 逐行添加标记点 for _, row in df.iterrows(): folium.Marker( location=[row['lat'], row['lon']], popup=f"数值: {row['value']}", # 弹窗显示对应数值 icon=folium.Icon(color=row['marker_color']) # 绑定映射好的颜色 ).add_to(m) # 保存地图 m.save('colored_markers_map.html')
场景2:连续渐变颜色(随数值平滑变化)
如果想要颜色随数值连续渐变(比如数值越小越绿,越大越红),可以用branca.colormap生成线性颜色映射:
创建连续颜色映射
先导入LinearColormap,基于数值的最小最大值生成渐变配色:from branca.colormap import LinearColormap # 定义渐变颜色范围,比如从绿到黄再到红 colormap = LinearColormap( colors=['#00FF00', '#FFFF00', '#FF0000'], vmin=df['value'].min(), # 数值最小值 vmax=df['value'].max() # 数值最大值 )用CircleMarker实现渐变标记
这里注意:Folium的普通Marker Icon不支持自定义十六进制颜色,所以推荐用CircleMarker(圆形标记)来实现,它可以直接接受十六进制颜色值:# 初始化地图 m = folium.Map(location=[df['lat'].mean(), df['lon'].mean()], zoom_start=10) # 逐行添加渐变圆形标记 for _, row in df.iterrows(): marker_color = colormap(row['value']) # 根据数值获取对应颜色 folium.CircleMarker( location=[row['lat'], row['lon']], radius=6, # 标记大小 color=marker_color, fill=True, fill_color=marker_color, popup=f"数值: {row['value']}" ).add_to(m) # 把颜色条添加到地图上,方便查看数值对应颜色 colormap.add_to(m) # 保存地图 m.save('gradual_color_map.html')
两种方式可以根据你的需求选:离散区间适合分类明确的场景,连续渐变适合展示数值的趋势变化。
内容的提问来源于stack exchange,提问作者Ken
相关产品推荐
相关产品推荐

