具有多个系列的 Python 堆叠条形图

Gus*_*nte 0 python charts matplotlib 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]})
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

mos*_*gen 5

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

df.plot(kind="bar", stacked=True)
Run Code Online (Sandbox Code Playgroud)

给我们这个图表:

具有负值的堆积条形图

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

带总线的堆积条形图

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

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()
Run Code Online (Sandbox Code Playgroud)