在同一图中绘制多个堆叠条

时间:2017-11-09 15:40:44

标签: python pandas matplotlib

我想在同一个情节中多个堆叠的条形图。这是我的代码:

let bottomContraint = NSLayoutConstraint(item: self.collectionView, attribute: NSLayoutAttribute.bottom, relatedBy: NSLayoutRelation.equal, toItem: self.textField, attribute: NSLayoutAttribute.top, multiplier: 1.0, constant: 8.0)

self.view.addConstraint(bottomContraint)

结果如下:

enter image description here 当我想把它们拼凑在一起时,第二个情节压倒了我。我该怎么办?

3 个答案:

答案 0 :(得分:3)

这应该按你想要的方式工作:

import pandas as pd

df = pd.DataFrame(dict(
    A=[1, 2, 3, 4],
    B=[2, 3, 4, 5],
    C=[3, 4, 5, 6],
    D=[4, 5, 6, 7]))

import matplotlib.pyplot as plt
%matplotlib inline
fig = plt.figure(figsize=(20, 10))

ab_bar_list = [plt.bar([0, 1, 2, 3], df.B, align='edge', width= 0.2),
               plt.bar([0, 1, 2, 3], df.A, align='edge', width= 0.2)]

cd_bar_list = [plt.bar([0, 1, 2, 3], df.D, align='edge',width= -0.2),
               plt.bar([0, 1, 2, 3], df.C, align='edge',width= -0.2)]

enter image description here

请记住,一组的width值必须为正,而第二组的值为负。也可以align使用edge 您必须将具有最大值的条放在具有最低值的条之前。如果没有明显或组成模式,请使用align edgewidth方法与@piRSquared建议的方法。
另一种方法是从绿色条中访问每个值并将其与红色条中的相应值进行比较,并相应地进行绘图(在这个中进行太多不必要的工作)。

答案 1 :(得分:2)

我认为这很简单。希望其他人能够提供更好的解决方案。我所做的是获取列的差异并运行堆积图表。

df = pd.DataFrame(dict(
    A=[1, 2, 3, 4],
    B=[2, 3, 4, 5],
    C=[3, 4, 5, 6]
))

df.diff(axis=1).fillna(df).astype(df.dtypes).plot.bar(stacked=True)

enter image description here

进行比较

fig, axes = plt.subplots(1, 2, figsize=(10, 4), sharey=True)

df.plot.bar(ax=axes[0])
df.diff(axis=1).fillna(df).astype(df.dtypes).plot.bar(ax=axes[1], stacked=True)

enter image description here

答案 2 :(得分:0)

实际上有一种通过 bottom 关键字堆叠条形的直接方法
(如果您使用 plt.barh 绘制水平条形图,请使用 left 而不是 bottom)!

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame(dict(A=[1, 2, 3, 4], B=[2, 3, 4, 5], C=[3, 4, 5, 6]))
df2 = df / 2

f, ax = plt.subplots()
ax.bar(df.index, df.A, align='edge', width=0.2)
ax.bar(df.index, df.B, align='edge', width=0.2, bottom=df.A)
ax.bar(df.index, df.C, align='edge', width=0.2, bottom=df.A + df.B)

ax.bar(df2.index, df2.A, align='edge', width=-0.2)
ax.bar(df2.index, df2.B, align='edge', width=-0.2, bottom=df2.A)
ax.bar(df2.index, df2.C, align='edge', width=-0.2, bottom=df2.A + df2.B)