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
相关产品推荐
相关产品推荐

