如何使用ipywidgets联动更新Folium热力图?
修正后可运行实现方案
核心逻辑:folium为静态渲染组件,无法直接通过属性绑定动态更新,我们用ipywidgets.Output作为地图容器,监听选择器的选中值变化后重新生成热力图渲染即可,不需要用到widgets.link(该方法仅支持绑定两个ipywidget组件的属性,无法绑定pandas DataFrame,这也是你报错的直接原因)。
完整代码如下:
import ipyvuetify as v import ipywidgets as widgets import folium from folium.plugins import HeatMap as hm import pandas as pd # 你的GTD数据集保持原有导入即可,此处假设你已经完成gtd数据导入 # gtd = pd.read_csv('你的GTD数据文件路径.csv') terrorists = [ 'Taliban', 'Shining Path (SL)', 'Islamic State of Iraq and the Levant (ISIL)', 'Farabundo Marti National Liberation Front (FMLN)', 'Al-Shabaab', 'Irish Republican Army (IRA)', 'Revolutionary Armed Forces of Colombia (FARC)', 'New Peoples Army (NPA)', 'Kurdistan Workers Party (PKK)', 'Boko Haram' ] # 1. 创建选择器组件 widget_terrorist_selector = v.Select(label='选择恐怖组织', items=terrorists, v_model=terrorists[2]) # 2. 创建地图渲染容器 map_output = widgets.Output() # 3. 定义更新回调函数 def update_map(change): # 获取当前选中的组织名称 selected_group = change['new'] # 筛选对应数据 selected_data = gtd.loc[gtd['Group'] == selected_group] coords = selected_data[['Latitude','Longitude']].dropna() # 去除空坐标避免报错 # 清空之前的地图输出 map_output.clear_output() # 生成新的热力图 with map_output: base_map = folium.Map(location = [25,15], tiles = "cartodbdark_matter", zoom_start = 2) hm(coords).add_to(base_map) display(base_map) # 4. 监听选择器的v_model属性变化,触发更新 widget_terrorist_selector.observe(update_map, names='v_model') # 5. 初始化渲染默认组织的热力图 update_map({'new': widget_terrorist_selector.v_model}) # 6. 组合显示选择器和地图 widgets.VBox([widget_terrorist_selector, map_output])
原有代码的错误点说明
widgets.link仅支持绑定两个继承了HasTraits类的ipywidget对象,你试图绑定pandas DataFrame的Group列,不属于widget对象,因此抛出类型错误- 变量定义顺序错误:你在调用
observe方法之后才定义widget_terrorist_selector,运行时会找不到变量 v.Select的选中值存储在v_model属性中,不存在selected属性,observe方法的第二个参数是要监听的属性名,不是组件名
内容的提问来源于stack exchange,提问作者fchisowsky
相关产品推荐
相关产品推荐

