【问题标题】:Bar Chart: How to choose color if value is positive vs value is negative条形图:如果值为正与值为负,如何选择颜色
【发布时间】:2014-04-14 04:53:37
【问题描述】:

我有一个带有正负值的 pandas 数据框,我想将其绘制为条形图。

我想绘制正值“绿色”和负值“红色”(非常原始......哈哈)。

我不确定如何通过 if > 0 'green' else

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

【问题讨论】:

    标签: python matplotlib pandas


    【解决方案1】:

    我会为观察值是否大于 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> 语法。

    【讨论】:

    • 我正在尝试使用 Pandas 0.20.3 amb matplotlib 2.0.2 重现此示例,但它不起作用。所有的条都是黑色的。你知道为什么吗?
    • @RamonCrehuet 这是一个错误,请参阅github.com/pandas-dev/pandas/issues/16822。解决方法是将颜色放在一个额外的列表中,请参阅github.com/pandas-dev/pandas/issues/…
    • 尝试将颜色图作为列表而不是 pandas.Seriesdata['values'].plot(kind='barh', color=[data.positive.map({True: 'r', False: 'b'})]) 一起传递
    【解决方案2】:

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

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

    【讨论】:

      【解决方案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'))
      

      给予

      【讨论】:

        【解决方案4】:

        借鉴@Max Ghenis 的答案(这对我不起作用,但似乎是包中的一个小改动):

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

        给予:

        .. 你期望看到的。

        【讨论】:

          猜你喜欢
          • 2021-11-01
          • 2013-10-05
          • 2014-05-13
          • 1970-01-01
          • 2019-04-11
          • 2023-03-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多