Matplotlib条形图选择颜色,如果值为正,则值为负

时间:2014-03-10 20:58:00

标签: python matplotlib pandas

我有一个带有正值和负值的pandas DataFrame作为条形图。我想绘制正面颜色'绿色'和负面值'红色'(非常原始...大声笑)。如果>我不知道如何通过0'绿色'其他< 0'red'?

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

bar plot

4 个答案:

答案 0 :(得分:16)

我会为观察是否大于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'}))

bar plot with positives green and negatives red

另外,您可能需要注意不要让列名与DataFrame属性重叠。 DataFrame.values为DataFrame提供底层的numpy数组。名称重叠会阻止您使用df.<column name>语法。

答案 1 :(得分:3)

定义

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

然后

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

给予

enter image description here

它也适用于多个酒吧系列

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

给予

enter image description here

答案 2 :(得分:1)

如果要避免添加列,可以一步完成TomAugspurger的解决方案:

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

bar plot with positives green and negatives red

答案 3 :(得分:0)

使用@Max Ghenis答案(这对我不起作用,但似乎是软件包中的一个较小更改):

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

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

给予:

enter image description here

..您希望看到的内容。