如何在Streamlit结合Altair的条形图中根据OVERDUE字段的布尔值设置不同条形颜色?
如何在Streamlit结合Altair的条形图中根据OVERDUE字段的布尔值设置不同条形颜色?
嗨,我懂你现在卡在哪啦!其实要实现根据OVERDUE的布尔值给条形设置不同颜色,只需要在Altair的encode方法里加上color编码就可以搞定,还能自定义你想要的绿红配色哦~
直接给你修改后的完整代码,关键改动我会标注说明:
import altair as alt import streamlit as st import pandas as pd # 模拟你的数据框(实际使用时替换成你自己的df_to_display即可) data = { "PRODUKT": ["C", "A", "X", "T", "S", "M", "V", "R"], "CURRENT_DELAY": [546, 76, 27, 21, 3, 3, 3, 3], "OVERDUE": [False, False, True, True, True, True, False, True] } df_to_display = pd.DataFrame(data) 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"), ), # 👇关键新增:根据OVERDUE字段设置条形颜色 color=alt.Color( "OVERDUE:N", # :N表示将布尔值当作名义类别处理,区分真假两个分组 scale=alt.Scale( domain=[False, True], # 对应OVERDUE的两个取值 range=["#2ecc71", "#e74c3c"] # 自定义颜色:绿色对应False,红色对应True ), legend=alt.Legend(title="Overdue Status") # 自定义图例标题,让图表更清晰 ) ), use_container_width=True, )
关键步骤说明:
- 我们在
encode中新增了color参数,绑定OVERDUE字段,用:N指定它是名义类型,这样Altair会把False和True看作两个独立的类别,分别分配颜色。 - 通过
alt.Scale实现颜色映射:domain列出字段的所有可能取值,range对应每个取值的颜色代码,你可以根据喜好替换成其他颜色(比如用green、red这样的颜色名称也可以)。 - 如果不需要显示图例,只需要把
legend=None加到alt.Color配置里就行,这样图表会更简洁。
这样修改后,你的条形图就会自动根据OVERDUE的真假值显示对应颜色啦,试试看吧!
备注:内容来源于stack exchange,提问作者brillenheini
相关产品推荐
相关产品推荐

