You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

创建带离散填充色的Folium地图时所有图形颜色一致如何解决

Folium离散填充色全部相同问题排查与修复

根因

这是Python循环中lambda函数的延迟绑定特性导致的:循环中定义的lambda表达式不会在定义时立刻捕获当前轮次r['fill_color']的值,只会在lambda实际被调用(也就是Folium渲染地图时)才会取值,此时循环已经执行完毕,r指向数据集最后一行的记录,因此所有几何图形都用了最后一行的填充色。

修复方案

有两种常用的修复方式,推荐优先使用第二种,执行效率更高:

方案1:修改lambda添加默认参数绑定当前值

给lambda增加默认参数,Python的默认参数会在函数定义时完成赋值,就能把当前轮次的颜色值绑定到每一个lambda函数中,修改循环内的GeoJson配置即可:

for _, r in gzones.iterrows():
    sim_geo = gpd.GeoSeries(r['geometry'])
    geo_j = sim_geo.to_json()
    # 新增默认参数fill_color绑定当前轮次的颜色值
    geo_j = folium.GeoJson(data=geo_j,
                           style_function=lambda x, fill_color=r['fill_color']: {'fillColor': fill_color})
    folium.Tooltip(r['Name']).add_to(geo_j)
    geo_j.add_to(m)

方案2:直接传入完整GeoDataFrame(更优)

不需要逐行迭代生成GeoJson,直接把整个GeoDataFrame传给folium.GeoJson,通过读取feature属性的方式取值,从根源上避免循环绑定问题:

m = folium.Map(location=[40.6725, -73.985], zoom_start=14, tiles='CartoDB positron')
title_html = '''
              <h3 align="center" style="font-size:16px"><b>{}</b></h3>
             '''.format('Gowanus Projects')

# 一次性加载所有几何要素,无需循环
folium.GeoJson(
    data=gzones,
    style_function=lambda feature: {
        # 注意此处颜色列名要和你的数据集列名完全一致,示例中为Fill_Color,不要写错大小写
        'fillColor': feature['properties']['Fill_Color'],
        'color': 'black', # 可选配置:边框颜色
        'weight': 1, # 可选配置:边框宽度
        'fillOpacity': 0.7 # 可选配置:填充透明度
    },
    tooltip=folium.GeoJsonTooltip(fields=['Name']) # 直接配置tooltip,无需循环添加
).add_to(m)

m.get_root().html.add_child(folium.Element(title_html))
m

注意事项

检查数据集颜色列的名称大小写是否和代码中取值的名称一致,你提供的数据集示例中列名为Fill_Color,原有代码中写的是r['fill_color'],如果大小写不匹配会取不到值,也会导致颜色异常。

内容的提问来源于stack exchange,提问作者Adam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 07:36:03