我有一个带有正值和负值的pandas DataFrame作为条形图。我想绘制正面颜色'绿色'和负面值'红色'(非常原始...大声笑)。如果>我不知道如何通过0'绿色'其他< 0'red'?
data = pd.DataFrame([[-15], [10], [8], [-4.5]],
index=['a', 'b', 'c', 'd'],
columns=['values'])
data.plot(kind='barh')
答案 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'}))
另外,您可能需要注意不要让列名与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'))
给予
它也适用于多个酒吧系列
df=pd.DataFrame(np.random.randint(-10,10,(4,6)))
df.plot.barh(color=bar_color(df,'r','g'))
给予
答案 2 :(得分:1)
如果要避免添加列,可以一步完成TomAugspurger的解决方案:
data['values'].plot(kind='barh',
color=(data['values'] > 0).map({True: 'g', False: 'r'}))
答案 3 :(得分:0)
使用@Max Ghenis答案(这对我不起作用,但似乎是软件包中的一个较小更改):
tseries = data['values']
color = (tseries > 0).apply(lambda x: 'g' if x else 'r')
splot = tseries.plot.barh(color=color)
给予:
..您希望看到的内容。