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

use*_*920 17 python matplotlib pandas

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

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

在此输入图像描述

Tom*_*ger 20

我会为观察是否大于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'}))
Run Code Online (Sandbox Code Playgroud)

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

  • @RamonCrehuet这是一个错误,请参阅https://github.com/pandas-dev/pandas/issues/16822.解决方法是将颜色放在一个额外的列表中,请参阅https://github.com/pandas-dev/pandas/issues/16822#issuecomment-316199053 (2认同)

Max*_*nis 20

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

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

条形图,阳性为绿色,阴性为红色