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
相关产品推荐
相关产品推荐

