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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 08:50:07