Altair如何用区间选择分别控制散点图不同编码通道的聚合范围
实现方案
核心逻辑是对两个聚合指标分别做区间匹配,不使用全局过滤器筛选整个数据集:给马力和排量各生成一个条件字段,仅当数据行落在对应选择器的选中区间时才保留原值,否则设为空值,聚合求和时空值会被自动忽略,就实现了两个区间独立控制对应指标聚合范围的效果。
你可以直接使用以下修改后的完整代码:
import altair as alt from vega_datasets import data cars = data.cars.url brush1 = alt.selection(type="interval", encodings=['x']) brush2 = alt.selection(type="interval", encodings=['x']) scatter = alt.Chart(cars).mark_point(size=100).encode( x = 'HP_sum:Q', y = 'Dis_sum:Q', color = 'Origin:N', tooltip = ['Origin:N', 'HP_sum:Q', 'Dis_sum:Q'] ).transform_calculate( # 仅在brush1选中区间内的行保留马力值,否则为空 HP_qualified='vlSelectionTest("brush1", datum) ? datum.Horsepower : null', # 仅在brush2选中区间内的行保留排量值,否则为空 Dis_qualified='vlSelectionTest("brush2", datum) ? datum.Displacement : null' ).transform_aggregate( HP_sum='sum(HP_qualified)', Dis_sum='sum(Dis_qualified)', groupby=['Origin'] ) range_sel1 = alt.Chart(cars).mark_line().encode( # 提取年份整数展示,符合你的使用需求 x = alt.X('year(Year):Q', title='年份'), y = alt.Y('mean(Horsepower):Q', title='平均马力') ).add_selection( brush1 ).properties( height = 100 ) range_sel2 = alt.Chart(cars).mark_line().encode( x = alt.X('year(Year):Q', title='年份'), y = alt.Y('mean(Displacement):Q', title='平均排量') ).add_selection( brush2 ).properties( height = 100 ) scatter & range_sel1 & range_sel2
补充说明
- 你之前尝试的全局过滤器会统一过滤整个数据集,无法实现两个指标独立筛选的需求
- transform_window的frame参数是相对当前数据行的滑动偏移,不适用这种全局固定范围的聚合计算
- transform_bin是用来做数据分箱统计的,和当前需求场景不匹配
内容的提问来源于stack exchange,提问作者roble
相关产品推荐
相关产品推荐

