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

基于Altair使用滑块组件实现多折线累积展示图表

问题解决:Altair滑块实现累积显示曲线

问题背景

拥有一个以x列为X轴,1至10列为Y轴曲线的DataFrame,需要实现:

  • 用滑块组件实现累积选择:默认仅显示1条曲线
  • 拖动滑块时逐步增加显示的曲线数量,最多显示全部10条
  • 当前已实现全部曲线同时展示,但滑块选择功能完全无效

错误代码

data = df.melt('x')
chart = alt.Chart(data).mark_line().encode(
    x='x',
    y='value',
    color='variable'
)

slider = alt.binding_range(min=1, max=10, step=1)
slider_selection = alt.selection_single(bind=slider, fields=['variable'])

chart.add_selection(slider_selection).transform_filter(slider_selection)

问题原因

  1. 类型不匹配:variable字段是字符串类型(如'1'、'2'),但滑块返回的是数值类型,直接绑定筛选会失效
  2. 逻辑错误:原代码是筛选等于滑块值的曲线,无法实现累积显示的需求

修复后的代码

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

# 数据生成(用户提供的代码)
n = 50
Xtest = np.linspace(-5, 5, n).reshape(-1,1)

def kernel(a, b, param):
    sqdist = np.sum(a**2,1).reshape(-1,1) + np.sum(b**2,1) - 2*np.dot(a, b.T)
    return np.exp(-.5 * (1/param) * sqdist)

param = 0.1
K_ss = kernel(Xtest, Xtest, param)
L = np.linalg.cholesky(K_ss + 1e-15*np.eye(n))
f_prior = np.dot(L, np.random.normal(size=(n,10)))

df = pd.DataFrame(f_prior)
df.columns += 1
df['x'] = Xtest
df.columns = df.columns.map(str)

# 数据处理与图表构建
data = df.melt('x')

# 1. 创建滑块选择器,默认值设为1(初始显示1条曲线)
slider = alt.binding_range(min=1, max=10, step=1, name='显示曲线数量:')
slider_selection = alt.selection_single(bind=slider, fields=['num'], init={'num': 1})

# 2. 构建图表:先将字符串类型的variable转为数值,再筛选小于等于滑块值的曲线
chart = alt.Chart(data).mark_line().encode(
    x='x:Q',
    y='value:Q',
    color='variable:N'
).transform_calculate(
    # 将variable字符串转为整数,命名为num
    num='parseInt(datum.variable)'
).add_selection(
    slider_selection
).transform_filter(
    # 累积筛选:显示num <= 滑块值的所有曲线
    alt.datum.num <= slider_selection.num
)

chart

关键修改点

  • 类型转换:通过transform_calculate将variable字符串转为整数类型的num字段,匹配滑块的数值类型
  • 累积筛选逻辑:使用alt.datum.num <= slider_selection.num实现“显示滑块值及以下的所有曲线”
  • 默认值设置:在selection_single中通过init={'num': 1}设置初始仅显示1条曲线

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 03:18:40