如何隐藏Python Folium Choropleth图例并同步图层控制?
解决Folium Choropleth图例与图层控制同步的问题
Folium自带的图层控制默认不会联动Choropleth的图例显示,要实现选中对应图层才显示其图例,可通过自定义JavaScript代码实现:
第一步:给图层和图例添加可识别标识
创建Choropleth时,通过name参数给每个图层设置唯一名称,后续JS会通过这个名称匹配对应图例:import folium m = folium.Map(location=[5.55, -0.2], zoom_start=7) # 创建绿色图层 green_layer = folium.Choropleth( geo_data=你的地理数据, data=你的绿色图层数据, columns=['id', 'value'], key_on='feature.id', fill_color='Greens', name='绿色图层' ).add_to(m) # 创建蓝色图层 blue_layer = folium.Choropleth( geo_data=你的地理数据, data=你的蓝色图层数据, columns=['id', 'value'], key_on='feature.id', fill_color='Blues', name='蓝色图层' ).add_to(m)第二步:添加自定义JS控制图例显隐
通过folium.Element插入JS代码,监听图层控制的勾选事件,根据选中状态切换对应图例的显示/隐藏:js_code = """ document.addEventListener('DOMContentLoaded', function() { // 获取图层控制的所有复选框 const layerChecks = document.querySelectorAll('.leaflet-control-layers-selector'); // 获取所有Choropleth图例(默认类名为chroma-legend) const allLegends = document.querySelectorAll('.chroma-legend'); // 按图层添加顺序对应图例(绿色图层对应第一个图例,蓝色对应第二个) const greenLegend = allLegends[0]; const blueLegend = allLegends[1]; // 初始化时只显示选中图层的图例 updateLegends(); // 给每个复选框绑定切换事件 layerChecks.forEach(check => { check.addEventListener('change', updateLegends); }); function updateLegends() { // 获取当前选中的图层名称 const selectedLayers = Array.from(layerChecks) .filter(cb => cb.checked) .map(cb => cb.nextElementSibling.textContent.trim()); // 先隐藏所有图例 allLegends.forEach(leg => leg.style.display = 'none'); // 显示选中图层对应的图例 if (selectedLayers.includes('绿色图层')) greenLegend.style.display = 'block'; if (selectedLayers.includes('蓝色图层')) blueLegend.style.display = 'block'; } }); """ # 将JS代码添加到地图中 m.get_root().html.add_child(folium.Element(js_code)) # 添加图层控制组件 folium.LayerControl().add_to(m) # 保存地图 m.save('sync_legend_map.html')注意要点:
- 若图例的DOM类名有变动,需通过浏览器开发者工具查看实际类名,调整JS中的选择器
- 图层
name参数要和JS中判断的名称完全一致,否则无法匹配 - 代码支持多图层同时选中,会自动显示所有选中图层的图例
内容的提问来源于stack exchange,提问作者G. Macia
相关产品推荐
相关产品推荐

