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

Altair垂直拼接图表后下拉筛选致柱状图空问题求助

问题:Altair图表垂直拼接后下拉筛选失效

我要实现两个Altair图表:

  • 第一个通过图例选择Artist,展示各Artist的年度累计销量折线图
  • 第二个通过下拉框筛选Year,展示对应年份各Artist的销量柱状图

数据库包含Artist、Sales、Year三个字段。两个图表单独运行都正常,但垂直拼接后,第一个图表功能正常,第二个图表选择年份后完全为空。我用VS Code的Python Notebooks开发,试过调试、拆分图表都没用,但拼接两个柱状图是正常的,说明拼接本身没问题。

原代码示例

import altair as alt
import pandas as pd

# Sample Data
top = pd.DataFrame({
    'Artist': ['Artist1', 'Artist2', 'Artist3', 'Artist1', 'Artist2', 'Artist3'],
    'Sales': [100, 200, 300, 150, 250, 350],
    'Year': ['2020', '2020', '2020', '2021', '2021', '2021'],
})

# Selection for the legend
select_artist_legend = alt.selection_point(fields=["Artist"], bind="legend")

# First plot (cumulative sales over years)
line = alt.Chart(top).transform_window(
    cumulative_sales='sum(Sales)',
    sort=[{'field': 'Year'}],
    groupby=['Artist']
).mark_line().encode(
    alt.X("Year:T"),
    alt.Y("cumulative_sales:Q"),
    alt.Color("Artist:N"),
    opacity=alt.condition(select_artist_legend, alt.value(1.0), alt.value(0.1))
).add_params(select_artist_legend)

# Dropdown selection for the year
year_dd = alt.binding_select(options=sorted(top.Year.unique()), name="Year")
year_select = alt.selection_point(fields=["Year"], bind=year_dd, name='year_select')

# Third plot (sales by artist for selected year)
bar = alt.Chart(top).mark_bar().encode(
    alt.X("Artist:N"),
    alt.Y("Sales:Q"),
    alt.Color("Artist:N")
).add_params(year_select).transform_filter(year_select)

# Combine the charts
combined_chart = line & bar
combined_chart

问题原因

拼接图表后,图例选择器select_artist_legend默认作用于整个组合图表。初始状态下该选择器未选中任何Artist,导致柱状图的数据被这个全局选择器过滤一空,即便年份选择器生效,也没有数据可展示。

解决方案

有两种可行的修改方式:

方式一:设置图例选择器初始选中所有Artist

修改图例选择器,添加empty='all'参数,让初始状态下所有Artist都被选中,避免全局过滤导致柱状图无数据:

import altair as alt
import pandas as pd

# Sample Data
top = pd.DataFrame({
    'Artist': ['Artist1', 'Artist2', 'Artist3', 'Artist1', 'Artist2', 'Artist3'],
    'Sales': [100, 200, 300, 150, 250, 350],
    'Year': ['2020', '2020', '2020', '2021', '2021', '2021'],
})

# 修改图例选择器,添加empty='all'
select_artist_legend = alt.selection_point(fields=["Artist"], bind="legend", empty='all')

# First plot (cumulative sales over years)
line = alt.Chart(top).transform_window(
    cumulative_sales='sum(Sales)',
    sort=[{'field': 'Year'}],
    groupby=['Artist']
).mark_line().encode(
    alt.X("Year:T"),
    alt.Y("cumulative_sales:Q"),
    alt.Color("Artist:N"),
    opacity=alt.condition(select_artist_legend, alt.value(1.0), alt.value(0.1))
).add_params(select_artist_legend)

# Dropdown selection for the year
year_dd = alt.binding_select(options=sorted(top.Year.unique()), name="Year")
year_select = alt.selection_point(fields=["Year"], bind=year_dd, name='year_select')

# Third plot (sales by artist for selected year)
bar = alt.Chart(top).mark_bar().encode(
    alt.X("Artist:N"),
    alt.Y("Sales:Q"),
    alt.Color("Artist:N")
).add_params(year_select).transform_filter(year_select)

# Combine the charts
combined_chart = line & bar
combined_chart

方式二:限制图例选择器仅作用于折线图

给图例选择器添加encodings=['color']参数,让它只关联折线图的颜色编码,不会影响柱状图:

select_artist_legend = alt.selection_point(fields=["Artist"], bind="legend", encodings=['color'])

两种方法都能解决拼接后柱状图下拉筛选为空的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 02:06:00