You need to enable JavaScript to run this app. Altair如何用区间选择分别控制散点图不同编码通道的聚合范围
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 07:00:05