创建带离散填充色的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
相关产品推荐
相关产品推荐

