
本文介绍如何使用 Altair 在 Streamlit 中根据 DataFrame 的布尔列(如 OVERDUE)为条形图的每根柱子分配不同颜色(如 True → 红色,False → 绿色),并通过 alt.when().then().otherwise() 实现声明式条件着色。
本文介绍如何使用 altair 在 streamlit 中根据 dataframe 的布尔列(如 `overdue`)为条形图的每根柱子分配不同颜色(如 `true` → 红色,`false` → 绿色),并通过 `alt.when().then().otherwise()` 实现声明式条件着色。
要在 Altair 中实现基于条件的条形图颜色定制(例如:OVERDUE == True 时显示红色,否则绿色),关键在于将颜色通道(color)与条件逻辑绑定,而非静态指定单一颜色。Altair 提供了函数式条件编码语法 alt.when(...).then(...).otherwise(...),专为此类场景设计。
以下为完整、可直接运行的解决方案:
import altair as alt
import streamlit as st
# 假设 df_to_display 已定义(含 PRODUKT, CURRENT_DELAY, OVERDUE 列)
color = alt.when(alt.datum.OVERDUE == True).then(alt.value('red')).otherwise(alt.value('green'))
st.altair_chart(
alt.Chart(df_to_display)
.mark_bar()
.encode(
x=alt.X("CURRENT_DELAY", axis=alt.Axis(title="Current Delay (days)")),
y=alt.Y(
"PRODUKT",
axis=alt.Axis(title="Product"),
sort=alt.EncodingSortField(field="CURRENT_DELAY", order="descending"),
),
color=color, # ✅ 动态颜色通道
),
use_container_width=True,
)
? 注意事项与最佳实践:
-
alt.datum.OVERDUE是访问当前数据行字段的标准写法(不可简写为"OVERDUE"或OVERDUE); - 颜色值推荐使用标准 CSS 颜色名(如
'red','green','steelblue')或十六进制(如'#d32f2f'),确保跨平台一致性; - 若需扩展多条件(如三色:
OVERDUE==True→ 红,CURRENT_DELAY > MAX_DELAY→ 橙,其余 → 绿),可嵌套alt.when().then().when().then().otherwise()链式调用; - 该方案完全声明式,无需预处理 DataFrame 或添加辅助列,保持数据纯净性与代码可读性。
通过此方法,您即可在 Streamlit 应用中构建具备业务语义的可视化图表——让“逾期”状态一目了然,真正实现数据驱动的直观洞察。










