多个系列的Python堆叠条形图

时间:2018-06-20 17:11:13

标签: python matplotlib charts bokeh seaborn

我需要创建一个像下面的图表一样的一系列堆积的条形图。有些值为正,有些为负。我希望显示的图表就像excel的堆叠条形图一样,它向上堆叠正值,向下堆叠负值。 是否有一个简单的方法可以对N个类别执行此操作?

以下是一些示例数据:

df = pd.DataFrame(index=['06-11-2018', '06-12-2018', '06-13-2018', '06-14-2018', '06-15-2018'], 
                  data={'A': [-378, -2347, 509, 987, 513], 
                        'B': [-527, -2599, 765, 533, 670], 
                        'C': [-2343, -2273, 2093, 2197, 1990], 
                        'D': [-1845, -1853, 3325, 1306, 2160]})

enter image description here

1 个答案:

答案 0 :(得分:1)

数据框的plot函数以您描述的方式处理负值。如果我们将数据框中的某些值更改为负值,则该行

df.plot(kind="bar", stacked=True)

向我们提供此图表:

Stacked bar chart with negative values

我们可以通过对数据框的行进行求和并在与条形图相同的Series上绘制返回的axes对象,来在问题的图像中添加类似于黑线的“总计”线:

Stacked bar chart with total line

生成第二张图表的代码如下。

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame(index=['06-11-2018', '06-12-2018', '06-13-2018',
                         '06-14-2018', '06-15-2018'], 
                  data={'A': [-378, 2347, 509, 987, 513], 
                        'B': [527, 2599, -765, 533, 670], 
                        'C': [2343, -2273, 2093, -2197, 1990], 
                        'D': [1845, 1853, -3325, 1306, 2160]})

ax = df.plot(kind="bar", stacked=True)
df.sum(axis=1).plot(ax=ax, color="k")

plt.show()