柱状图:如何选择正值和负值的颜色

40 投票
4 回答
42204 浏览
提问于 2025-04-17 21:42

我有一个pandas的数据表,里面有正数和负数,我想把它画成柱状图。

我想把正数用绿色表示,负数用红色(这主意很普通...哈哈)。

我不太确定怎么判断,如果大于0就用'绿色',否则小于0就用'红色'?

data = pd.DataFrame([[-15], [10], [8], [-4.5]],
                    index=['a', 'b', 'c', 'd'],
                    columns=['values'])
data.plot(kind='barh')

bar plot

4 个回答

4

根据@Max Ghenis的回答(虽然对我来说不太管用,但看起来只是包裹里有个小改动):

tseries = data['values']
color = (tseries > 0).apply(lambda x: 'g' if x else 'r')

splot = tseries.plot.barh(color=color) 

结果是:

在这里输入图片描述

.. 这就是你期待看到的效果。

4

定义

def bar_color(df,color1,color2):
    return np.where(df.values>0,color1,color2).T

然后

data.plot.barh(color=bar_color(data,'r','g'))

结果是

在这里输入图片描述

这也适用于多个条形系列

df=pd.DataFrame(np.random.randint(-10,10,(4,6)))
df.plot.barh(color=bar_color(df,'r','g'))

结果是

在这里输入图片描述

30

如果你想避免添加一列数据,可以一步到位地使用TomAugspurger的解决方案:

data['values'].plot(kind='barh',
                    color=(data['values'] > 0).map({True: 'g',
                                                    False: 'r'}))

正数用绿色表示,负数用红色表示的条形图

40

我会创建一个虚拟的列,用来表示观察值是否大于0。

In [39]: data['positive'] = data['values'] > 0

In [40]: data
Out[40]: 
   values positive
a   -15.0    False
b    10.0     True
c     8.0     True
d    -4.5    False

[4 rows x 2 columns]

In [41]: data['values'].plot(kind='barh',
                             color=data.positive.map({True: 'g', False: 'r'}))

正值用绿色表示,负值用红色表示的条形图

另外,你需要小心不要让列名和数据框(DataFrame)里的属性重名。DataFrame.values可以获取数据框的底层numpy数组。如果列名和属性重名,就不能使用df.<列名>这种写法了。

撰写回答