基于Altair与Python实现费城地理空间图与投诉柱状图联动
Altair实现地理空间图与柱状图的悬停联动
核心实现思路
通过Altair的selection_single创建悬停触发的选择器,将两张图表的交互绑定到同一个选择字段(如分区名称),实现地理图悬停时柱状图对应柱子的高亮效果。
完整代码示例
import altair as alt import geopandas as gpd import pandas as pd # 加载并合并数据(替换为你的实际数据路径) geo_data = gpd.read_file("philly_districts.geojson") complaints_data = pd.read_csv("philly_police_complaints.csv") merged_data = geo_data.merge(complaints_data, on="district_name") # 创建悬停选择器:绑定分区名称,鼠标悬停触发,空状态不隐藏元素 highlight = alt.selection_single( fields=['district_name'], on='mouseover', empty='none', name='DistrictHighlight' ) # 地理空间图配置 geo_chart = alt.Chart(merged_data).mark_geoshape(stroke='white').encode( # 悬停时高亮颜色,默认灰色 color=alt.condition(highlight, alt.value('#2c7fb8'), alt.value('#e0e0e0')), tooltip=[alt.Tooltip('district_name:N', title='分区'), alt.Tooltip('complaints:Q', title='投诉量')] ).add_selection( highlight ).properties( width=450, height=400, title='费城各分区地理分布' ) # 柱状图配置 bar_chart = alt.Chart(merged_data).mark_bar().encode( x=alt.X('district_name:N', title='分区'), y=alt.Y('complaints:Q', title='警察投诉量'), # 选中柱子全透明,未选中半透明+灰色,实现高亮 opacity=alt.condition(highlight, alt.value(1), alt.value(0.2)), color=alt.condition(highlight, alt.value('#2c7fb8'), alt.value('#e0e0e0')), tooltip=[alt.Tooltip('district_name:N', title='分区'), alt.Tooltip('complaints:Q', title='投诉量')] ).properties( width=450, height=400, title='各分区警察投诉量统计' ) # 水平拼接两张图表 geo_chart | bar_chart
关键细节与问题排查
- 字段一致性:确保两张图表使用完全相同的字段名绑定选择器(示例中为
district_name),且字段类型一致(均为字符串)。 - 选择器参数:
empty='none'是关键,它保证鼠标未悬停时所有元素正常显示;如果用empty='all'会导致未悬停时所有柱子透明。 - 样式优化:同时使用
opacity和color双重高亮,比单一效果更直观;地理图添加stroke='white'可以区分相邻分区。 - 数据校验:确认合并后的数据中每个分区都有对应的地理信息和投诉量,避免出现缺失值导致的交互失效。
内容的提问来源于stack exchange,提问作者lou415
相关产品推荐
相关产品推荐

