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

Altair/Streamlit技术问询:如何获取图表选择交互的选中值?

获取Altair图表点击元素的详细信息

当然可以,以下两种方案可以满足你的需求:

1. 纯Altair实现:图表下方联动展示详情

通过transform_filter配合选择器,筛选出被点击柱状图对应的数据,再用文本或表格组件在图表下方展示额外信息。

示例代码:

import altair as alt
import pandas as pd

# 示例数据
df = pd.DataFrame({
    'category': ['A', 'B', 'C', 'D'],
    'value': [10, 20, 15, 25],
    'detail1': ['分类A详情', '分类B详情', '分类C详情', '分类D详情'],
    'detail2': ['额外信息A', '额外信息B', '额外信息C', '额外信息D']
})

# 定义点击选择器
single = alt.selection_single(on="click", fields=['category'], empty='none')

# 主柱状图(带高亮效果)
bar_chart = alt.Chart(df).mark_bar().encode(
    x='category',
    y='value',
    color=alt.condition(single, alt.value('orange'), alt.value('steelblue'))
).add_selection(single)

# 单字段详情文本展示
detail_text = alt.Chart(df).mark_text(align='left', fontSize=14).encode(
    text=alt.Text('detail1:N'),
    y=alt.value(30)  # 固定文本位置
).transform_filter(single)

# 多字段详情表格展示
detail_table = alt.Chart(df).mark_text(align='left', fontSize=12).encode(
    x=alt.value(0),
    y=alt.Y('row_number():O', axis=None),
    text=['category:N', 'value:Q', 'detail1:N', 'detail2:N']
).transform_filter(single).transform_window(
    row_number='row_number()'
)

# 垂直组合图表:柱状图 + 详情组件
combined_chart = bar_chart & (detail_text | detail_table)
combined_chart.show()

2. 结合Web框架:在图表外部页面区域展示详情

如果需要在图表以外的页面位置展示信息,可以结合Streamlit、Panel这类Python Web框架,通过框架的状态管理获取选中数据。

以Streamlit为例:

import altair as alt
import pandas as pd
import streamlit as st

df = pd.DataFrame({
    'category': ['A', 'B', 'C', 'D'],
    'value': [10, 20, 15, 25],
    'detail1': ['分类A详情', '分类B详情', '分类C详情', '分类D详情'],
    'detail2': ['额外信息A', '额外信息B', '额外信息C', '额外信息D']
})

# 定义选择器,指定name参数用于状态获取
single = alt.selection_single(on="click", fields=['category'], empty='none', name='chart_selector')

bar_chart = alt.Chart(df).mark_bar().encode(
    x='category',
    y='value',
    color=alt.condition(single, alt.value('orange'), alt.value('steelblue'))
).add_selection(single)

# 渲染柱状图
st.altair_chart(bar_chart, use_container_width=True)

# 获取并展示选中数据
selected_category = st.session_state.get('chart_selector_category')
if selected_category:
    selected_row = df[df['category'] == selected_category].iloc[0]
    st.subheader('选中元素详情')
    st.write(f"- 分类: {selected_row['category']}")
    st.write(f"- 数值: {selected_row['value']}")
    st.write(f"- 详情1: {selected_row['detail1']}")
    st.write(f"- 详情2: {selected_row['detail2']}")

内容的提问来源于stack exchange,提问作者V W

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 16:50:23