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

Altair图表透明度表达式失效求助(Streamlit环境)

解决Streamlit中Altair搜索交互柱状图的opacity条件报错问题

问题分析

你遇到的报错核心是参数引用和字段表达式的写法不符合Altair的Python API规范:

  • 直接传入search_input param对象到alt.expr.regexp中无法被正确解析
  • alt.datum.Profissional的写法本身没问题,但需要和正确的参数引用方式配合使用

修正后的完整代码

import pandas as pd
import altair as alt
import streamlit as st

# 替换为你的实际数据
data = pd.Series([10, 20, 15, 25], index=['Ana', 'Bruno', 'Carla', 'Diego'])
# 重构数据框,避免变量名冲突
data_df = pd.DataFrame({'Profissional': data.index, 'Quantidade': data.values})

search_input = alt.param(
    value='',
    bind=alt.binding(
        input='search',
        placeholder="Profissional",
        name='Pesquisar ',
    )
)

chart = alt.Chart(data_df).mark_bar().encode(
    x=alt.X('Profissional', sort=None),
    y='Quantidade',
    opacity=alt.condition(
        # 用字符串表达式直接编写JS逻辑,更直观且避免API引用问题
        f"test(regexp({search_input.name}, 'i'), datum.Profissional)",
        alt.value(1),  # 匹配的柱子完全不透明
        alt.value(0.05)  # 不匹配的柱子半透明
    )
).properties(
    width=700,
).add_params(
    search_input
)

st.write(chart)

关键修改说明

  1. 变量名规范:将生成的DataFrame命名为data_df,避免和原始Series变量data重名,减少逻辑混淆
  2. 表达式写法优化:直接使用字符串形式的JavaScript表达式,和你注释里的逻辑完全一致,这种写法绕开了Python API对param和datum引用的兼容性问题,稳定性更高
  3. 交互逻辑验证:regexp({search_input.name}, 'i')创建不区分大小写的正则,test函数检查datum.Profissional是否匹配该正则,匹配则保持完全不透明,否则变为半透明

可选:Python API原生写法

如果你偏好使用Altair的Python API而非字符串表达式,可将opacity条件修改为:

opacity=alt.condition(
    alt.expr.test(
        alt.expr.regexp(alt.param(search_input.name), 'i'),
        alt.datum.Profissional
    ),
    alt.value(1),
    alt.value(0.05)
)

这里的核心是用alt.param(search_input.name)显式引用参数,而非直接传入param对象,确保表达式能正确解析参数值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 20:57:42