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

如何在Altair中实现带交互滑块的滚动平均线窗口变换?

实现Altair交互式滚动平均线(叠加在原始数据背景上)

要实现背景原始折线+交互式滚动平均线的效果,你需要通过Vega表达式引用参数来动态控制窗口大小,直接给transform_window的frame参数传Altair Param对象会触发类型错误,因为frame需要的是数字/可解析为数字的表达式,而非参数对象。

完整实现代码

import altair as alt
import pandas as pd
import numpy as np

# 生成示例数据
np.random.seed(42)
x = np.arange(100)
y = np.cumsum(np.random.randn(100))
df = pd.DataFrame({'x': x, 'y': y})

# 定义可交互的窗口大小参数(滑块)
window_size = alt.param(
    value=10,
    bind=alt.bind_range(min=1, max=30, step=1, name='滚动窗口大小:')
)

# 原始数据折线(背景层)
base_line = alt.Chart(df).mark_line(color='#e0e0e0').encode(
    x='x:Q',
    y='y:Q'
)

# 交互式滚动平均线(叠加层)
rolling_avg_line = alt.Chart(df).mark_line(color='#ff4500', strokeWidth=2).encode(
    x='x:Q',
    y='rolling_mean:Q'
).transform_window(
    rolling_mean='mean(y)',
    # 按x轴排序,保证窗口计算顺序正确
    sort=[alt.SortField('x')],
    # 使用Vega表达式引用参数,动态生成窗口范围
    frame=["-param('window_size')", 0]
).add_params(
    window_size
)

# 组合两层图表
(base_line + rolling_avg_line).properties(width=700, height=400)

关键说明

  1. 错误原因:你之前尝试给frame传{'params': 'op_var'}这种参数对象,不符合Vega-Lite对frame的类型要求(必须是null、数字,或能解析为数字的表达式字符串)。
  2. 解决方案:用"-param('参数名')"这种Vega表达式字符串来引用参数,让Vega-Lite动态计算窗口的起始位置,从而实现滑块控制滚动窗口大小的交互效果。
  3. 版本适配:你使用的Altair 5.0.0rc1完全支持这种参数引用方式,无需额外配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 22:05:26