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

Folium下拉菜单失效问题求助(附Python代码)

问题解决:Folium交互式分级统计图修复(下拉菜单+颜色定制)

核心问题分析

  • 下拉菜单交互无效:Folium的Choropleth对象属于静态图层,直接修改geojson.data无法触发地图更新,必须重新创建并替换图层才能生效。
  • 颜色不符合需求:默认的RdYlGn色阶无法实现“低增长率深绿、增长率>0为红色”的定制化要求,需要自定义颜色映射规则。

修改后的完整代码

import folium
import ipywidgets as widgets
from IPython.display import display, clear_output
import geopandas as gpd
from folium.features import LinearColormap

# 数据预处理(保留原有逻辑)
final_consumption_data = data_completed_coordinates[data_completed_coordinates['PRODUCT'] == 'Final      consumption']

# 加载并保存GeoJSON(保留原有逻辑)
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
world.to_file("world_countries.geojson", driver='GeoJSON')
geojson_path = "world_countries.geojson"

# 初始化地图
map_choropleth = folium.Map(tiles='OpenStreetMap', location=[48, 8], zoom_start=2)

# 自定义颜色映射:低增长率深绿,>0红色
growth_min = final_consumption_data['GROWTH_RATE'].min()
growth_max = final_consumption_data['GROWTH_RATE'].max()
colormap = LinearColormap(
    colors=['#006400', '#228B22', '#FFA07A', '#FF0000'],
    vmin=growth_min,
    vmax=growth_max,
    caption='Consumption growth rate (%)'
)
# 添加0%分界标注,强化正负增长率区分
colormap.add_legend_element(value=0, label='0%', color='#808080')

# 创建下拉菜单
year_dropdown = widgets.Dropdown(
    options=sorted(final_consumption_data['YEAR'].unique()),
    value=2016,
    description='Year:',
    disabled=False,
)

# 定义更新函数:移除旧图层并添加新图层
def update_choropleth(year):
    # 清除地图上已有的Choropleth图层
    for layer_name, layer in list(map_choropleth._children.items()):
        if isinstance(layer, folium.Choropleth):
            del map_choropleth._children[layer_name]
    
    # 筛选对应年份的数据
    filtered_data = final_consumption_data[final_consumption_data['YEAR'] == year]
    
    # 创建新的Choropleth图层
    folium.Choropleth(
        geo_data=geojson_path,
        name=f'Growth Rate ({year})',
        data=filtered_data,
        columns=['COUNTRY', 'GROWTH_RATE'],
        key_on='feature.properties.name',
        fill_color=colormap,
        fill_opacity=0.7,
        line_opacity=0.2,
        legend_name=f'Consumption growth rate (%) - {year}',
        highlight=True
    ).add_to(map_choropleth)
    
    # 添加图层控制器
    folium.LayerControl().add_to(map_choropleth)
    
    # 刷新Jupyter中的显示
    clear_output(wait=True)
    display(year_dropdown)
    display(map_choropleth)

# 绑定下拉菜单事件
year_dropdown.observe(lambda change: update_choropleth(change.new), names='value')

# 初始化显示默认年份(2016)
update_choropleth(2016)

# 保存静态HTML(注:该HTML不包含Jupyter的ipywidgets交互)
map_choropleth.save('choropleth_interactive.html')

关键改动说明

  1. 交互逻辑修复

    • 每次更新年份时,先移除地图上已有的Choropleth图层,避免图层叠加导致的显示混乱。
    • 使用clear_output(wait=True)在Jupyter环境中刷新地图显示,确保新图层能正确渲染。
    • 初始化时直接调用update_choropleth(2016),确保默认年份的图层正确加载。
  2. 颜色定制优化

    • 通过LinearColormap自定义颜色渐变,从深绿(#006400)过渡到红色(#FF0000),中间添加过渡色提升视觉层次感。
    • 新增add_legend_element手动标注0%分界,更清晰区分正负增长率区间。
  3. 下拉菜单体验优化

    • 对年份选项进行排序,提升用户选择体验。
    • 调整描述文本为Year:,简洁清晰。

注意事项

  • 保存的choropleth_interactive.html为静态文件,不包含Jupyter的ipywidgets交互功能。若需HTML端的交互,需结合branca库与JavaScript实现。
  • 确保final_consumption_data中COUNTRY列的国家名称,与GeoJSON中feature.properties.name的名称完全匹配,否则会出现数据匹配失败的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 01:21:01