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

Pandas绘制横向条形图(barh)时根据Sum值设置条形颜色失败问题排查

问题排查与解决

嘿,我一眼就发现问题所在啦!你在条件判断里用错了运算符,导致颜色逻辑完全没按预期执行,所有条形才会全变成绿色😉

错误根源

你用了&来做逻辑与判断,但在Python的单个数值逻辑判断场景下,这个运算符的优先级和用法都不对:
&是位运算符,它的优先级比比较运算符(>、<=)更高,所以val > 10 & val <=20会被Python错误解析成:(val > (10 & val)) & (val <=20),这个计算结果几乎不可能匹配你的预期逻辑,直接导致第二个橙色分支永远不会触发,最终所有数据都默认走了第一个绿色分支。

修正方案

方案1:用Python原生逻辑运算符and

对于单个数值的逻辑判断,直接用and代替&是最直观的写法:

import pandas as pd
import numpy as np
df = pd.DataFrame(
    data={
        "Time": ['07/10/2022 08:22:44','07/10/2022 08:27:22','07/10/2022 08:27:44','07/10/2022 08:29:55','07/10/2022 08:33:14','07/10/2022 08:48:44'],
        "Sum":[50,5,10,20,5,30]
    }
)

df=df.set_index('Time')
colors=[]
for val in df['Sum']:
    if val <= 10:
        colors.append('green')
    elif val > 10 and val <=20:  # 替换&为and
        colors.append('orange')
    else:
        colors.append('red')
ax = df.plot(kind='barh', color=colors)

方案2:用位运算符&但给条件加括号

如果习惯用&(比如处理pandas Series向量化判断时常用),需要给每个比较条件单独加括号,确保运算顺序正确:

colors=[]
for val in df['Sum']:
    if val <= 10:
        colors.append('green')
    elif (val > 10) & (val <=20):  # 给每个条件单独加括号
        colors.append('orange')
    else:
        colors.append('red')

更简洁的写法:用numpy向量化生成颜色

不用循环,直接用np.where一次性生成颜色列表,高效又简洁:

import numpy as np

df=df.set_index('Time')
colors = np.where(df['Sum'] <=10, 'green', 
                  np.where((df['Sum']>10) & (df['Sum']<=20), 'orange', 'red'))
ax = df.plot(kind='barh', color=colors)

修改后,条形颜色就会正确匹配你的规则:≤10为绿色,10<Sum≤20为橙色,>20为红色。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 17:17:43